Redis过期时间以及淘汰策略

过期时间

开发者可以给字典一个哈希节点(数据)设置过期时间,设置方法如下:

  • EXPIRE:某一个键值对在几秒之后过期。
  • PEXPIRE:某一个键值对在几毫秒之后过期。
  • EXPIREAT:某一个键值对的过期时间为该指定的秒数。
  • PEXPIREAT:某一个键值对的过期时间为该指定的毫秒数。
EXPIRE key 5   //五秒后过期
PEXPIRE key 5000  //五千毫秒之后过期
PEXPIREAT key 1377257300 //时间达到这个毫秒数的时候过期,EXPIREAT作用相同只不过是秒为单位

注:SETNX也可以设置过期时间,其内部原理与EXPIRE完全一样。
无论使用哪一个命令去设置键值对的过期时间,最后REDIS都会转变为使用PEXPIREAT命令来实现。
在这里插入图片描述

REDIS保存过期时间

我们都知道REDIS把数据的键值对保存在字典DICT中,其实redisDB对象中除了dict还有另一个字典expires,该字典专门用来保存过期时间。
在这里插入图片描述
所以设置,移除过期时间就是在expires字典上进行哈希节点的操作。

过期判定

如何通过expires来判断一个数据是否过期:
(1)查找expires字典中是否存在这个键,如果存在则取得过期时间。
(2)获取当前时间,判断当前时间是否大于过期时间,如果是则该键已经过期。

过期键删除策略

三种删除策略

  • 定时删除:在添加过期时间的时候,顺便开启定时器,时间到时删除数据。这种方法保证redis中不会存储过期的数据,内存是最友好的,但是通过计时器去触发操作对CPU担负太大,CPU不友好。(REDIS没有采用)
  • 惰性删除:放任过期的数据不处理,只有在键被操作的时候进行过期判断。Redis中会保存没有被使用并且过期的数据,CPU友好,内存不友好。
  • 定期删除:由Redis服务器定期去进行检查,同时每一次只检查一部分数据,至于检查多少数据节点,多少数据库,已经触发频率都由算法决定。

Redis淘汰策略

Redis目前采用的是惰性删除和定期删除配合的策略。
在redis中,定期会触发删除,并且在规定时间内,每次对每一个数据库的20个数据节点进行检查是否过期,过期则把数据删除。
同时在读取数据的时候进行是否过期,过期则把数据删除。

持久化时对过期键的处理

RDB、AOF在进行持久化或者恢复数据的时候都会对数据进行过期判断。

主从模式下过期处理

当Redis运行在集群模式下(主节点和从节点),从节点不会处理过期数据,过期键的删除都是由主服务器控制。主节点在删除一个过期键之后,会发送DEL命令给从节点,此时从节点才会删除数据,否则哪怕数据已经过期,但是client如果是在从节点进行数据读取,从节点一样会把已经过期的数据返回给客户端。
这样做的目的,主要是保证主从节点的数据一致性。

淘汰策略

当内存使用达到最大限制时, 如果需要存储新数据, 根据配置的策略(policies)的不同, Redis可能直接返回错误信息, 或者删除部分老的数据,redis的淘汰策略有以下几种:

  • noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。
  • allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
  • volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
  • allkeys-random: 所有key通用; 随机删除一部分 key。
  • volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
  • volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值