首页
学习
活动
专区
工具
TVP
发布

过期处理:Redis内部的清洁工,有效的管理和清理内存

我们在使用Redis的时候,经常会给某一个key设置存活时间或者过期时间,过期之后,key将不可用,当然也可以不设置,让它永不过期,永远可用。

那么对于那些设置了过期时间的key,Redis内部是怎么判断又是怎么处理的呢?

今天,我们就来看一下Redis内部的清洁工:Redis过期机制。

为Redis的KEY设置存活时间:

expire/pexpire命令:

expire name 10 (秒) | pexpire name 10000 (毫秒)

设置名为name的key在10秒钟后过期,成功返回1,失败返回0。

expireat/pexpireat命令:

expireat name 1584429920 (秒)| pexpireat name 1584429920000 (毫秒)

设置名为name的key在时间戳为1584429920时过期。

persist命令:persist name

移除名为name的key的过期时间,使得name永不过期。

ttl/pttl命令:ttl name (秒)| pttl name (毫秒)

查看名为name的key的剩余过期时间。

Redis设置存活或者过期时间是以Key为单位的,比如hash结构,只能设置整个hash表的存活或者过期时间。

三种过期策略:

1、定时删除:在设置key过期时间的同时,为该key创建一个定时器,key过期时进行删除。

优点:内存释放及时。

缺点:若key很多,定时器创建耗时;维护大量定时器;删除开销很大;严重影响cpu性能。

2、定期删除:每隔一段时间执行一次过期key的删除。

优点:

限制了删除时长和频率,减少删除操作对cpu的占用。-- 定时删除的缺点

定期删除了过期的key。--懒汉式删除的缺点

缺点:

内存占用和cpu耗时方面都介于定时和懒汉式之间。

需要设置标志位,以便下次删除时,从上次结束的位置遍历。

3、懒汉式删除:key过期时不删除,当访问key时才去检查key是否过期,过期了则删除,返回null。

优点:只在key取值时进行删除操作,只删除当前key且非删不可,对cpu占用少。

缺点:大量key过期且没有取值时,会造成无用内存占用。

合理设置删除操作的执行时长和执行频率,才能提高cpu利用率,发挥最大性能。

Redis采用的过期策略:定期删除+懒汉式删除

可通过redis.conf配置

hz 10 /*即1秒执行10次定期删除,100ms一次*/

maxmemory 200000000000 /*最大分配内存,超过时,会执行删除操作*/

1、懒汉式删除流程:

(1)在进行get等操作时,先检查key是否过期。

(2)若过期,先删除key,再进行操作。

(3)若没过期,直接进行操作。

2、定期删除流程:

(1)遍历每个数据库,redis.conf中database配置,默认为16。

(2)检查每个库中指定个数的key,默认20,即以下循环20次。

(3)如果当前库没有key设置过期时间,进入下一个库。

(4)随机获取一个key,检查是否过期,若过期则删除。

(5)判断定期操作是否超时,如果超时则退出定期删除。

3、RDB对过期key的处理:

(1)持久化之前,会检查key是否过期,过期的key不会写入rdb文件。

(2)恢复数据库之前,会检查key是否过期,过期key不会导入。

4、AOF对过期key的处理:

(1)持久化时,若key过期还没删除,没有操作命令不会写aof文件。

(2)持久化时,若key过期且正在删除,向aof文件追加一条del命令。

(3)AOF重写时,先判断key是否过期,过期key不会写入aof文件。

PS:如有任何问题或疑问,请留言告诉我。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200412A0J69P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券