过期删除策略
- 定期删除
100ms 扫描一定Key检查是否过期 - 惰性删除
访问到Key的时候检查是否过期,过期了删除
内存淘汰策略
- noeviction
直接返回错误 - lru
最久没有使用
allkey volatile - random
随机选择
allkey volatile - volatile-ttl
淘汰马上要过期Key - lfu
使用频率最少的
allkey volatile
缓存雪崩,缓存击穿,缓存穿透
缓存雪崩
大量key失效,重启
设置随机过期时间
缓存加标记
缓存预热
互斥锁缓存击穿
热点key失效
热点数据设置永不过期
互斥锁缓存穿透
数据库和缓存中都没有数据,一般来源于攻击
加业务层的校验
key设置对应的null值
布隆过滤器
线程模型
- Reactor模式
- 文件事件处理器
单线程为什么快
- 内存操作
- 非阻塞IO复用(扩展IO复用为什么高效)
- 单线程不加锁,避免上下文切换
集群方案
主从模式
哨兵模式
- 集群监控
- 消息通知
- 故障转移
- 配置中心
哨兵本身是高可用的,可以作集群
- 故障转移的时候
- 哨兵通常要3个实例
Redis Cluster方案
采用slot槽
- 通过哈希的方式将数据分片,每个节点分配一定数量的哈希槽来存储数据
- 每个数据会存储在多个互为主从的节点
- 先写主节点,再同步从节点
- 同一分片的多个节点的数据不是强一致性的
- 读取数据时,key没有落在该节点上,redis会返回转向指令
- 扩容的时候需要把旧的节点上的数据迁移到新的节点
- 采用gossip协议进行数据交换
优点
- 无中心,支持动态扩容,对业务透明
- 具备哨兵的监控和自动故障转移
- 客户端只需要链接任何一个节点
- 高性能
缺点
- 运维复杂
- 只能使用0号数据库
- 不支持批量
客户端分片
主从复制的原理
全量复制
- master生成RDB
- RDB发送给Slave
- slave清空数据,载入RDB
部分复制
- 复制偏移量,主从分别维护偏移量 offset
- master维护一个复杂积压缓冲区