过期时间相关命令
查看 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 中剩余内存不足以存储新加入的数据时,临时的删除一些其他数据,为新加入的数据腾出内存空间。
需要注意的时,逐出算法它会循环的去清理出内存,提供给新加入的数据,但不一定会成功。
数据逐出的相关配置
- maxmemory:Redis 占用物理内存最大比例,默认为0不限制。实际生产环境配置50% ~ 70%,剩下的空间用于执行bgsave命令和创建复制缓存区。
- maxmemory-samples:随机挑选待删除数据的个数
- 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