随笔集
1.redis集群
客户端分片,redis3.0开始支持redis-cluster集群来配置,每个节点保存数据和几点的状态
每个节点和其他节点都是相连的,保证高可用,客户端与集群中的任一节点相连,集群中内置了
1600多个哈希草,所有的节点映射后进行维护
2.redis事务
redis是支持事物的,但是不支持回滚,事务开始multi,结束采用exei
3.缓存雪崩,穿透和击穿
雪崩:缓存大面积失效导致数据库查询压力增大,缓存预热,不同key设置不同过期时间,定期
更新缓存
穿透:缓存和数据库都没有相关数据,参数校验,查询空结果集也进行缓存
击穿:缓存没有,数据库有 设置热点数据不过期,设置互斥锁来避免同一个key多次更新缓存
4.分布式事务
xa理论,及开启二段提交
事务协调者发起准备指令给参与者,参与者各自执行本地事务单不提交,然后发送ok指令给协调
者,收到全部ok后发起commit指令,各自提交事务并返回确认给协调者,只要有一处异常就全部
各自回滚,三段提交是在第一阶段前确保能正常连接数据库,表面由于连接异常导致的长时间阻
塞
大部分场景下不是很需要确保强一致性而是达到最终一致性即可,如果经典的锁券和扣库存操作
可以采用先生成不可见订单,然后同步调用锁券和扣库存操作,如果发生异常就针对异常异步发
送废单消息到mq,可以失败重试,其他系统在接收消息后各自判断是否进行回券和回库存,成功
则订单变为可见
5.优化查询
a.关键字段建立索引,索引字段为not null
b.管连查询代替子查询
c.减少表关联,去除多余字段
d.读写分离,加入缓存,主从同步
e.分库分表
尽量用全职索引,
最左前缀:查询从索引的最左前列开始并且不跳过索引中的列;
索 引列上不操作,范围之后全失效;
不等空值还有 OR,索引影响要注意;
like 以通配符%开 头索引失效会变成全表扫描的操作,字符串不加单引号索引失效
4.更新缓存的时候的一些操作
互斥锁:使用setnx来获取写入缓存的锁,为true表示当前没有线程进行构建,false则表示
当前有线程在构建,进行阻塞
热点数据不过期:在value中设置过期时间,当前时间如果大于设置时间则获取就缓存,并使
佣另外线程更新缓存并重新设置过期时间
5.redis数据结构的常用操作
hash:存储对象,可以直接获取对象的属性值 hset person name kex
list:lrang 来获取某个闭区间的元素,redis高性能分页
lpush rpop来做简单的队列操作(先进先出)
set:无序不重复,可以用来全局去重 sadd
求交集 sinter
求并集 sunion
求差集 sdiff
zset:排序的set,依据写入的分数进行排序
6.redis过期策略
采用定期删除策略+惰性删除策略
定期删除策略:每个100ms随机抽取20个key,删除其中过期的key,如果超过了1/4则重复之前的步骤
惰性删除策略:redis 4.0 引入了 lazyfree 的机制 ,再删除较大的对象的时候采用异步的形式,将操作
放到后台线程中执行,避免单线程的卡顿 unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存
内存淘汰策略:redis.conf中的maxmemory和maxmemory-policy设置 ,常用的有
allkeys-lru 超出后从所有的key中删除最少使用的key
volatile-lru 超出后从设置了过期时间的key中移除最少使用的key