Redis学习_7_删除策略

redis中的数据特征

redis作为一个内存级数据库,数据都在内存中,我们可以通过TTL指令来查看数据的状态:

  • 非负整数:具有时效性的数据(剩余有效时间)
  • -1:永久数据
  • -2:已过期数据、被删除数据、未定义数据

注意: redis中,执行完删除操作后,并不会马上把数据给删除,这要看具体的删除策略。

过期数据的底层结构

对于我们使用expireexpireatsetex这些操作添加的数据,除了在内存中给他们存储数据外,还会有一个额外的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用到的策略是:惰性删除 + 定期删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值