一.过期删除策略
1.redis怎么知道一个数据有没有过期
redis的数据库结构中会有一个dict expires(他的key存放的是数据的key,但是值存放的过期时间),用来记录过期时间。
2.是不是TTL到期了就立即删除?
惰性删除:当访问到数据的时候再判断是否到期,到期了就进行删除。
周期删除:服务器初始化的时候可以设置,开启一个定时任务或在每个事件循环前,定时抽样的删除部分过期的key,然后执行删除,删除方式有两种
1.开启定时任务serveCron(),按照sever.hz的频率执行key删除,模式为SLOW(低频多删)
2.在每个事件循环前会调用beforSleep()函数,执行key删除,模式为FAST(高频少删)
二.内存淘汰策略(maxmemory-policy noeviction)
当redis内存使用达到了设置的内存阈值,redis就会主动去删除部分key释放内存,redis会调用processCommand()方法进行内存淘汰
1.noeviction-不删除,不允许写入-报错
2.volatile-ttl,对设置ttl的key,删除ttl小的部分key
3.allkeys-random,对全体key,随机删除
4.volatile-random,对设置了ttl,随即删除
LRU,最近最少使用
5.allkeys-lru,对全体key,基于lru算法进行删除
6.volatile-lru,对设置了ttl,基于lru算法进行删除
LFU,最少频率使用(频率相同的情况下删除最远使用的那个)
7.allkeys-lfu,对全体key,基于lfu算法进行删除
8.volatile-lfu,对设置了ttl,基于lfu算法进行删除