Redis进阶篇:四、删除策略

在Redis中因为数据可以设置时效性,所以会产生一些过期的数据,处理那些过期的数据的方法就叫做删除策略。

过期数据

如何手动查看数据是否过期呢?我们可以利用以下命令:

ttl key		#查看key的有效时间单位s
  • 返回 -1:代表数据永久有效
  • 返回 -2:代表数据已过期
  • 返回其他数字:代表剩余有效时间

过期数据的底层存储结构

过期数据其实不需要我们去手动查询然后在执行删除策略。他是由Redis自动执行的。Redis怎么知道谁是过期数据谁不是呢?这就要依赖于内部的expires结构了:

在这里插入图片描述
(ps:其实key指向的应该是对应数据的内存地址,field也是对应的内存地址,这里为了方便理解就直接用数据代替)

三种删除策略

1、定时删除

一旦数据设定的有效时间到了,立马执行删除操作。

会消耗执行资源,释放存储资源,以时间换空间。

2、惰性删除

数据过期之后先不管它,到下次调用的时候再执行删除。

会大大减少执行资源的消耗,会占用存储资源,以空间换时间。

3、定期删除

综合以上两种策略的优缺点,定期删除是一个性能平衡的删除策略。

先举个例子来形象化一下定期删除:假设你是一个水果商人,你从南方进购一匹热带水果存储在好几个仓库里。你现在规定你的员工一个月内要检查水果10次,为了防止工人摸鱼,规定每次检查水果的时间为4个小时。检查的时候从仓库里随机挑选8箱,如果这8箱里有2箱以上都有坏果。那就将坏果处理掉,在这个仓库重新挑8箱再检查,如果还是有2箱以上有坏果那就一直重复。直到有坏果的箱数<=2箱。然后检查下一个仓库重复该步骤。如果在检查的时候突然被打断,要记住你检查的仓库编号下次接着检查。

Redis的定期删除策略就像上面所说的水果商人,它1s内执行server.hz(默认是10)次删除轮询,不过Redis没有员工,它是通过调用serverCron()—>databasesCron()—>activeExpireCycle()执行轮询检查操作的。通过activeExpireCycle()对Redis中每个数据库的expires进行检查,每次检查时间为250ms/server.hz。activeExpireCyclez()执行时从expires中随机挑选W个数据,如果这W个数据有W*25%以上都已经失效。那就将失效数据处理掉,在这个expires中重新挑选W个数据检查,如果还是有W*25%以上数据失效那就一直重复。直到失效数据数量<=W*25%。然后检查下一个expires重复该步骤。如果在检查的时候突然被打断,要记住你检查的expires编号下次接着检查。

感谢黑马

逐出策略

以上我们说的都是针对已经过期的数据的删除,那么当内存不足时,还有数据要存放,就会将还未过期的数据排挤掉,那么让那个数据出去呢?这就是逐出策略

服务端通过配置maxmemory-policy 来指定逐出策略:

感谢黑马

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值