Redis 中 key 的过期时间与删除策略

探讨Redis中过期键的处理策略,包括定时、惰性及定期删除,以及内存不足时的逐出算法,如volatile-lru和allkeys-random等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过期时间相关命令

查看 key 的 time to live

ttl key
  当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间

pttl key
  类似于 TTL 命令,但它 以毫秒为单位 返回 key 的剩余生存时间

设置key的存活时间

expire key seconds:以秒为单位设置 key 过期时间

hset  key1 field1 value1
expire key1  30:存活30s
hset  key1 field2 value2:更新key1,但key1的存活时间不会被刷新为30s**

pexpire key milliseconds:以毫秒为单位

expireat key timestamp:设置 key 存活到 timestamp
pexpireat key milliseconds-timestamp:以毫秒为单位的 timestamp

移除key的存活时间

persist key
  当生存时间移除成功时,返回 1 . 如果 key 不存在或 key 没有设置生存时间,返回 0 。

Redis两个方向下的数据删除策略

时效性数据的删除

删除策略的目标
  它是为了在内存和 CPU 占用之间,寻找一个平衡点,保证 Redis 整体性能不会下降太多。
时效性数据的存储结构
在这里插入图片描述

定时删除

由定时器任务去执行键的删除操作。
用时间换空间的思想

优点:到时间就会删除,内存会被快速释放掉
缺点:不会顾忌到 CPU 当前的情况,可能会造成 CPU 负荷过高,影响到 Redis 整体的吞吐量

惰性删除

数据到达过期时间时,不删除。等到下次访问数据时,如果数据过期了,删除数据并返回数据不存在。
用空间换性能做法

优点:降低了 CPU 性能的消耗
缺点:浪费内存,会出现过期的数据长时间占用内存的情况

折中方案:定期删除

周期性的轮询 Redis 中每个库的时效性数据表,并采用随机抽取的删除策略,利用过期数据占比是否大于25%决定是否再次进行随机抽取删除策略。
内存定期随机清理,CPU 资源消耗不大。

每秒钟执行service.hz(=10)次的 serverCron() --> databasesCron() --> activeExpireCycle()

Q:Redis 中使用的删除策略是什么?
A: 惰性删除 和 定期删除 两种策略

内存不足时的 逐出算法

当 Redis 中剩余内存不足以存储新加入的数据时,临时的删除一些其他数据,为新加入的数据腾出内存空间。

需要注意的时,逐出算法它会循环的去清理出内存,提供给新加入的数据,但不一定会成功。

数据逐出的相关配置

  1. maxmemory:Redis 占用物理内存最大比例,默认为0不限制。实际生产环境配置50% ~ 70%,剩下的空间用于执行bgsave命令和创建复制缓存区。
  2. maxmemory-samples:随机挑选待删除数据的个数
  3. maxmemory-policy:对被挑选出来的数据进行删除的策略,有如下三个方向的8种淘汰方式

检测易失数据,数据集为可能过期的 server.db[i].expires 表:

  • volatile-lru:least recently used,淘汰最远时间使用的数据
  • volatile-lfu:least frequently used,淘汰最近使用次数最少的数据
  • volatile-ttl:淘汰即将过期的数据
  • volatile-random:随机选择数据淘汰

检测全库数据,数据集为 server.db[i].dict

  • allkeys-lru:least recently used,淘汰最远时间使用的数据
  • allkeys-lfu:least frequently used,淘汰最近使用次数最少的数据
  • allkeys-random:随机选择数据淘汰

放弃数据驱逐

  • no-enviction:禁止数据驱逐,当最大使用内存空间不足时,抛出 out of memory
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值