删除策略删除的是什么数据
删除的是过期数据,设置期限且时间已经到期的数据
查看Redis中数据的状态
ttl key
结果:
- XX:具有时效性的数据
- -1:永久保存的数据
- -2:已经过期的数据 或 已经被删除的数据 或 从未定义的数据
为什么要引入删除策略
如果我们监控每一条数据的时间到期,这样的守护进程会占用CPU使Redis的性能下降,如果我们不处理过期数据,也会导致数据过多占用内存导致Redis将内存撑爆宕机,所以删除策略的目标并不是要完全的删除过期数据,而是在删除过期数据和CPU性能之间寻找一种平衡
Redis数据删除策略
- 定时删除
- 惰性删除
- 定期删除
定时策略
Redis设置一个带有时限的key,当过期时间到达时,Redis会立即删除数据
定时策略特点
用处理器性能换内存空间
惰性删除
Redis设置一个带有时限的key,当过期时间到达时,Redis并不会立即删除数据
当下一次访问数据时,如果该数据没有到达过期时间,则返回数据
如果该数据到达过期时间,Redis会先删除该数据,然后返回不存在
惰性删除的特点
拿存储空间换处理器性能
定期删除
两个指标
- server.hz
- W
server.hz
用来表示每秒执行多少次检测方法
W
每个库随机挑选W个数据进行检测,如果超过25%的key过期,则再次循环该过程
设置ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP为W的值
主要流程
Redis每秒执行server.hz次方法进行检测过期数据,检测方法会对所有的库中expires存储块进行检查并删除,每个expires中随机挑选W个数据进行检测,如果超过25%的key过期,则再次循环该过程,如果没有超过25%的key过期,则到下一个expires存储块进行检查,检查时会有current_db字段对当前处理的expires进行判断
什么是数据逐出策略
当Redis剩余内存无法不满足加入数据最低内存要求,那么就会以一定的策略释放部分内存,本方法会反复执行,当Redis确认无法清理内存时,则抛出异常OOM(Out Of Memory)
逐出策略相关配置
// 最大可使用内存
maxmemory
// 每次选取待删除数据的个数(随机选取数据的方式作为待检测数据)
maxmemory-samples
// 删除策略
maxmemory-policy
逐出策略
- 检测容易过期的数据
- volatile-lru(建议): 挑选最近最少使用的数据淘汰(长时间不用的)
- volatile-lfu: 挑选最近使用次数最少的数据淘汰
- volatile-ttl: 挑选将要过期的数据淘汰
- volatile-random: 随机选择数据淘汰
- 检测全库数据
-
allkeys-lru:挑选最近最少使用的数据淘汰(长时间不用的)
-
allkeys-lfu:挑选最近使用次数最少的数据淘汰
-
allkeys-random:随机选择数据淘汰
- 放弃数据驱逐
- no-enviction: 禁止驱逐数据