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

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

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

redis 全局过期时间 redis过期时间为0_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  /*最大分配内存,超过时,会执行删除操作*/
  • 懒汉式删除流程:
  • 在进行get等操作时,先检查key是否过期
  • 若过期,先删除key,再进行操作。
  • 若没过期,直接进行操作。
  • 定期删除流程:
  • 遍历每个数据库,redis.conf中database配置,默认为16。
  • 检查每个库中指定个数的key,默认20,即以下循环20次。
  • 如果当前库没有key设置过期时间,进入下一个库。
  • 随机获取一个key,检查是否过期,若过期则删除。
  • 判断定期操作是否超时,如果超时则退出定期删除。
  • RDB对过期key的处理:
  • 持久化之前,会检查key是否过期,过期的key不会写入rdb文件。
  • 恢复数据库之前,会检查key是否过期,过期key不会导入。
  • AOF对过期key的处理:
  • 持久化时,若key过期还没删除,没有操作命令不会写aof文件。
  • 持久化时,若key过期且正在删除,向aof文件追加一条del命令。
  • AOF重写时,先判断key是否过期,过期key不会写入aof文件。

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