Redis的过期策略及内存淘汰机制

过期策略

定时删除

定时删除是在设置key过期时间的同时,会创建一个定时器,定时器在key过期时间到达时,立即删除key.
这种策略保证过期key被删除和内存释放的及时性,但是在过期key比较多的情况下,定时器会占用相应高的cpu资源,将cpu资源用在删除过期key上,会对服务器的响应时间和吞吐量造成影响.
如: 有大量的请求正在等待服务器处理,并且服务器内存足够的情况下,服务器应当优先将cpu资源用于处理请求.
创建一个定时器需要用到Redis服务器中的时间事件,而当前时间事件是用无序链表来实现的,查找一个事件的时间爱你复杂度为o(n),并不高效.

定期删除

定期删除是每隔一段时间,就对Redis存储的数据进行一次检查,删除里面过期的key,由Redis内部的算法决定检查多少个DB和删除多少个key.通过限制操作执行时长和频率的方式来减少删除操作对cpu资源的占用.
定期删除: Redis默认每100ms进行检查,发现有过期的key则删除

惰性删除

惰性删除是放任key过期不管,但是每次获取key时都会检查获取的key是否过期,如果过期则删除.
此策略对cpu极其友好,只有再获取key时才对key进行检查,缺点是对内存不友好,如果一个key已经过期,却再未被请求获取,那它永远不会被删除,除非执行flushdb命令.这样会导致大量无用的数据占用内存

Redis采用的是定期删除策略+惰性删除策略

内存淘汰机制

如果过期策略没能及时删除过期的key从而清理内存,那么Redis就会采用内存淘汰机制
1.volatile-lru: 从已设置过期时间的数据集(server.db[i].expires)中选择最近最少使用的数据淘汰
2.volatile-ttl: 从已设置过期时间的数据集(server.db[i].expires)中选择将要过期的数据淘汰
3.volatile-random: 从已设置过期时间的数据及(server.db[i].expers)中随机选择数据淘汰
4.allkeys-lru: 从所有数据集(server.db[i].dict)中选择最近最少使用的数据淘汰
5.allkeys-random: 从所有数据集(server.db[i].dict)中任意选择数据淘汰
6.no-enviction: 禁止淘汰数据,新写入会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值