浅谈Redis的几个过期策略


Posted in Redis onMay 27, 2021

概述

设置过期时间

expire key time(以秒为单位) 这是最常用的方式
setex(String key, int seconds, String value) 字符串独有的方式
除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间如果没有设置时间,那缓存就是永不过期如果设置了过期时间,之后又想让缓存永不过期,使用persist key

三种过期策略

定时删除

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

优点:

保证内存被尽快释放

缺点:

若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重

懒汉式式删除

key过期的时候不删除,每次通过key获取值的时候去检查是否过期,若过期,则删除,返回null。

优点:

删除操作只发生在通过key取值的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)

缺点:

若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

定期删除

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

优点:

通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点
定期删除过期key--处理"懒汉式删除"的缺点

缺点:

在内存友好方面,不如"定时删除"(会造成一定的内存占用,但是没有懒汉式那么占用内存)
在CPU时间友好方面,不如"懒汉式删除"(会定期的去进行比较和删除操作,cpu方面不如懒汉式,但是比定时好)

难点:

合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了),每次执行时间太长,或者执行频率太高对cpu都是一种压力。
每次进行定期删除操作执行之后,需要记录遍历循环到了哪个标志位,以便下一次定期时间来时,从上次位置开始进行循环遍历

说明:

memcached只是用了惰性删除,而redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以看做是redis优于memcached的一点);

对于懒汉式删除而言,并不是只有获取key的时候才会检查key是否过期,在某些设置key的方法上也会检查(eg.setnx key2 value2:该方法类似于memcached的add方法,如果设置的key2已经存在,那么该方法返回false,什么都不做;如果设置的key2不存在,那么该方法设置缓存key2-value2。假设调用此方法的时候,发现redis中已经存在了key2,但是该key2已经过期了,如果此时不执行删除操作的话,setnx方法将会直接返回false,也就是说此时并没有重新设置key2-value2成功,所以对于一定要在setnx执行之前,对key2进行过期检查)。

Redis采用的过期策略

懒汉式删除+定期删除

懒汉式删除流程:

在进行get或setnx等操作时,先检查key是否过期;
若过期,删除key,然后执行相应操作;
若没过期,直接执行相应操作;
定期删除流程
简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key

遍历每个数据库(就是redis.conf中配置的"database"数量,默认为16)
检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)
如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。
对于定期删除,在程序中有一个全局变量currentdb来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的currentdb就是11,下一次定期删除就从第11个库开始遍历,假设currentdb等于15了,那么之后遍历就再从0号库开始(此时currentdb==0)

总结

在实际中,如果我们要自己设计过期策略,在使用懒汉式删除+定期删除时,控制时长和频率这个尤为关键,需要结合服务器性能,已经并发量等情况进行调整,以致最佳。

以上就是浅谈Redis的几个过期策略的详细内容,更多关于Redis的几个过期策略的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis三种集群模式详解
Oct 05 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
Redis命令处理过程源码解析
Feb 12 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis高并发缓存架构性能优化
May 15 Redis
解决 redis 无法远程连接
May 15 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis Lua脚本实现ip限流示例
Jul 15 Redis
Redis Cluster 字段模糊匹配及删除
May 27 #Redis
redis哨兵常用命令和监控示例详解
May 27 #Redis
Java Socket实现Redis客户端的详细说明
May 26 #Redis
redis实现共同好友的思路详解
详解Redis瘦身指南
May 26 #Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 #Redis
redis实现排行榜功能
May 24 #Redis
You might like
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python中对象的引用与复制代码示例
2017/12/04 Python
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
python实现日志按天分割
2019/07/22 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
软件设计的目标是什么
2016/12/04 面试题
小学生新年寄语
2014/04/03 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
员工福利申请报告
2015/05/15 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis