• Redis内存策略
    • 过期策略
      • 在使用Redis缓存的时候,我们可以通过expire命令给Redis的key设置TTL(存活时间) 当TTL过期之后会对key进行删除,从而起到内存回收的目的。 但是有没有想过底层是怎么做到的,有两个问题?? 1. Redis怎么知道一个key过期了 2. 是不是TTL过期之后就立马删除了
        • 第一个问题 Redis通过一个dict来存储相应key的对应过期时间。在Redis的存储结构中,有两个Dict:一个用来记录key-value;另一个用来记录key-TTL。
        • 第二个问题 并不是立马进行删除的,是通过一定的规则进行删除的: 比如惰性删除和周期删除
          • 惰性删除 惰性删除:顾名思义并不是在TTL到期后就立刻删除,而是在访问一个key的时候,检查该key的存活时间,如果已经过期才执行删除。
          • 周期删除 周期性的抽样部分过期的key,然后执行删除。有快和慢两种模式: ● SLOW模式是通过定时任务以固定频率(默认每秒10次)执行过期key的清理,每个执行周期不超过25ms。此模式会逐个检查数据库中的bucket,并抽样20个key检查是否过期,如果过期key的比例超过10%,则会再次抽样。 ● FAST模式则是在Redis事件循环前调用,每次执行不超过1ms,且两次执行的间隔不低于2ms。FAST模式同样会抽样20个key检查是否过期,并且如果过期key比例超过10%,也会再次抽样。 Redis中的SLOW模式和FAST模式是混合使用的,这两种模式的混合使用,确保了Redis在处理过期key时既保证了性能,又有效地清理了不再需要的key。
    • 淘汰策略
      • redis会在任何命令执行之前会先判断是否内存达到了阈值,然后去执行内存清理,如果内存清理失败的话就拒绝执行这条指令 当Redis内存使用达到设置的上限时,主动挑选部分key删除以释放更多内存的流程。 Redis支持8种不同策略来选择要删除的key:
        • ● noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。
        • ● volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
        • ● allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
        • ● volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
        • ● allkeys-lru: 对全体key,基于LRU算法进行淘汰
        • ● volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
        • ● allkeys-lfu: 对全体key,基于LFU算法进行淘汰
        • ● volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰