概述
文章目录
- redis中的数据特征
- 过期数据的底层结构
- 定时删除
- 惰性删除
- 定期删除
- 删除策略对比
redis中的数据特征
redis作为一个内存级数据库,数据都在内存中,我们可以通过TTL指令来查看数据的状态:
- 非负整数:具有时效性的数据(剩余有效时间)
- -1:永久数据
- -2:已过期数据、被删除数据、未定义数据
注意: redis中,执行完删除操作后,并不会马上把数据给删除,这要看具体的删除策略。
过期数据的底层结构
对于我们使用expire
、expireat
、setex
这些操作添加的数据,除了在内存中给他们存储数据外,还会有一个额外的hash结构,这个hash结构叫expires(如果redis有16个库的话,就会有16个expires,一个对应一个库),专门用来存有时效性数据的相关信息,那这个hash存的是个什么东西呢?它里面以数据的地址作为key,用它对应的过期时间作为value。
定时删除
创建一个定时器,如果一个key有设置过期时间,而且已经到过期时间的话,定时器就对这个key执行删除操作。
- 优点:节约内存,到时间就删除,快速释放不必要的内存占用。
- 缺点:CPU压力过大,不论CPU负载多高,都会占用CPU,会影响到redis服务器的响应时间和指令吞吐量。
惰性删除
数据过期后,不做处理,当下次访问该数据时再删除数据。在执行get
操作时,会先执行一个expireIfNeeded()
方法,来判断这个数据是否过期,如果过期就删除。
- 优点:节约CPU性能,发现必须删除时才删除。
- 缺点:内存压力大,会有长期占用。
定期删除
定期删除时前面两种方案的一个折中方案,既不会有太多的CPU占用,也不会有太多的内存占用。在了解这个策略之前,我们先看一下redis里的一个信息:server.hz。
这个server.hz是什么呢?这个就是我们定期删除策略里的一个参数,用来描述在1s内,执行多少次定期删除,这个值默认是10。
每次执行定期删除时,都会走一个方法:serverCron()
,这个方法代表对数据库做一个轮询,这里顺便提一嘴,redis的数据库默认有16个,当然这个也可以通过配置文件来修改。那在这个方法里做什么事情呢,会执行databaseCron()
,也就是去轮询每一个数据,从0到15,对于每一个数据,都会有一个activeExpireCycle()
方法,这个方法我们好好说道说道。
关于activeExpireCycle()
方法,就是对每一个数据库的expires区域逐一检测,每次执行时间为250ms/server.hz,也就是说,在一秒钟内,定期删除占用的时间为1/4秒。
在对每个expires检测时,会在其中随机去W个key去检查:
- 如果key超时,就删除key。
- 如果一轮中删除的key的数量 > W*25%,就对这个数据库循环检查。
- 如果一轮中删除的key的数量 < W*25%,就检查下一个数据库的expires空间。
其中,W的取值在配置文件中可以配置:ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP。
此外还有一个参数:current_db,这个会用来记录下一个要轮询的数据库,如果本次activeExpireCycle()
的时间到了,下一次就从current_db记录的数据库开始。
特点:
- CPU性能占用设置有峰值,检查频率可以自定义。
- 内存压力不大,长期占用内存的冷数据会被持续清理。
删除策略对比
定时删除:
- 节约内存,无占用
- 不分时段占用CPU资源,频度高
- 时间换空间
惰性删除:
- 内存占用严重
- 延时执行,CPU利用率高
- 空间换时间
定期删除:
- 内存定期随机清理
- 每秒花固定的CPU资源维护内存
- 随机抽查,重点抽查
目前redis用到的策略是:惰性删除 + 定期删除。
最后
以上就是自由白昼为你收集整理的Redis学习_7_删除策略redis中的数据特征过期数据的底层结构定时删除惰性删除定期删除删除策略对比的全部内容,希望文章能够帮你解决Redis学习_7_删除策略redis中的数据特征过期数据的底层结构定时删除惰性删除定期删除删除策略对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复