一、数据结构
string、list、hash、set、zset
二、管道
一次发送多个命令,节约往返时间
三、发布订阅
多个订阅,比如聊天,发布消息,订阅1用于实时展示,订阅2用户如kafka然后持久化mysql,订阅3存zset用于历史消息
四、穿透、击穿、雪崩
1、缓存穿透
缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
布隆过滤器可以使用redis的bitmap实现,多种hash算法标识
2、缓存击穿
缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
互斥锁:获取锁成功回源db,获取锁失败sleep后再尝试获取锁。
3、缓存雪崩
缓存雪崩:与缓存击穿的区别在于这里针对很多key缓存
1、随机缓存的失效时间,治标不治本
2、加锁排队,体验较差
3、二级缓存,比如hbase等
4、缓存标识,缓存标识失效时间小于数据失效时间,标识没有就进队列,异步更新
五、相关策略
1、缓存删除策略
定时删除、惰性删除、主动删除
2、缓存淘汰策略
当内存不足时Redis会选择一些缓存元素进行删除
1、no-enviction:禁止驱逐数据,新写入操作会报错
2、volatile-lru:从已设置过期时间的数据集选择最近最少使用的数据淘汰
3、volatile-ttl:从已设置过期时间的数据集选择将要过期的数据淘汰
4、volatile-random:从已设置过期时间的数据集选择任意的数据淘汰
5、allkeys-lru:从数据集选择最近最少使用的数据淘汰
6、allkeys-random:从数据集选择任意的数据淘汰
3、集群策略
主从、sentinel、cluster
六、持久化
RDB:全量dump
AOF:采用日志形式记录每一次写操作,追加。
RDB原理
采用操作系统的api:fork()。fork()出来的进程共享其父类的内存数据。仅仅是共享fork()出子进程的那一刻的内存数据,后期主进程修改数据对子进程不可见,同理,子进程修改的数据对主进程也不可见。
七、主从数据同步原理
1、全量同步
2、断点重续
八、redis分片算法
hash算法 -> 一致性hash算法 -> redis cluster,hash slot算法
1、hash算法
hash值再对分片数取模,如果有一个master宕机,分片数发生变化,导致大量的key无法取到有效缓存,都穿透到数据库中。
2、一致性hash算法
计算缓存服务器的hash值,放到0~2的32次方的圆上,将key值计算hash值在0~2的32次方的圆上找到对应的值,然后顺时针找最近的缓存缓存服务器,这样只影响宕机的master上面的key,只有这些key才会穿透到数据库中,添加服务器的话,也只是影响添加的服务器的hash值逆时针到最近节点的key值。
3、hash slot算法
默认16384个槽,通过CRC16(key) % 16384得到槽位。key和槽是多对一,槽和缓存节点是多对一。