redis 学习(三) --- 过期策略

    在开发中我们经常使用redis作为缓存,就不可避免的需要设置key的存活时间(命令:expire key TTL),redis会在指定的时间之后自动删除过期的键值对。但是redis是如何记录过期时间,以及过期后是怎样删除键值对的呢?我们接下来慢慢了解。

过期时间的存储

   在了解过期时间的存储之前,我们先了解一下redis的数据库的结构。redis服务器将所有的数据库保存在redisServer的db数组中,db数组中每一个元素都是redisDb结构,每一个表示一个数据库。默认有16个。其中redisDb中的属性如下

  • dict:数据库键空间,存储这数据库的所有键值对,其中键值对key是一个字符串对象,value是上字符串、列表、哈希、集合以及有序集合的任意一个。
  • expires:过期字典,保存着key的过期时间。

redis 学习(三) --- 过期策略

   添加一个key或者过期时间,就是对dict或者expires的增删改。判断一个key有没有过期,首先检查key值在expires中存在key值,如果有过期时间,那么去的过期时间。判断当前时间大于过期时间,如果大于,那么key过期,否则未过期。

过期删除策略

   有三种过期策略:

  • 定时删除:在设置key的过期时间,创建一个定时器,让定时器在key过期时间来临时,立即执行删除操作,对内存最友好,通过定时器,保障过期键尽肯能删除,并释放过期所占用的内存
  • 惰性删除:放任键不管,但是在每次键空间中获取key时,检查key是否过期,惰性删除对CPU时间最友好,但是对内存最不友好,因为
  • 定期删除:定期对数据库进行一次检查,删除里面的过期key。是上面两种的整合。每隔一段时间进行一次删除,可以通过限制删除的执行频率来减少对CPU的影响;同时,定期删除有效的减少了因过期导致的key的浪费。

    redis采用的是惰性删除(所有读写key都会进行检查,确保在执行真正命令前过滤掉过期的key,避免访问到过期key)和定期删除(周期执行,在规定时间内,分多次遍历服务器的数据库,从数据库的expires中随机获取一部分key,检查并删除)两种策略。