Redis expire 原理(策略)

redis设置过期时间:

expire key time(以秒为单位)–这是最常用的方式
setex(String key, int seconds, String value)–字符串独有的方式
**

三种过期策略

定时删除

在设置key的过期时间时,同时为每个key设置个定时器,在过期时将其移除。
优点:保证内存尽快被释放。
缺点:如果key的存活时间较短,则删除key会占用大量CPU时间片。(性能不好)

惰性删除,memcached采用

key过期的时候,并不删除。而是每次获取的时候,检查是否过期,若过期,则删除并返回null。
优点:无需定时器,不浪费CPU时间片
缺点:如果大量的key在添加后,并不被访问,则这些垃圾将浪费空间(可以认为是内存泄露,即无用的垃圾占用了大量内存)

定期删除

每隔一段时间执行一次删除过期key操作
优点:

  • 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理”定时删除”的缺点
  • 定期删除过期key–避开“惰性删除”的缺点

缺点:相比“定时删除”,内存不会及时释放。相比“惰性删除”,会浪费CPU时间片。

redis 的过期策略

惰性删除+定期删除

懒汉式删除流程:

  • 在进行get或setnx等操作时,先检查key是否过期;
  • 若过期,删除key,然后执行相应操作;
  • 若没过期,直接执行相应操作;

定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):

  • 遍历每个数据库(就是redis.conf中配置的”database”数量,默认为16)
  • 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)
  • 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
  • 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
  • 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)

参考

Redis过期策略及实现原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值