Redis 设置键值过期时间

马谦马谦马谦 Redis评论2,108字数 1244阅读 4 分 8 秒阅读模式

一、 expire 和 ttl 命令

1.1 基本用法

Redis 中的 EXPIER 命令可以给键值设置过期时间,相关的命令及其格式为:

两个命令分别表示设置秒级和毫秒级别的过期时间,到期之后系统会自动删除该键。

EXPIRE 命令返回 1 表示设置过期时间成功,返回 0 表示键不存在或者设置失败。

设置成功后可以使用 TTL 命令查看键值的过期时间,命令返回-1 表示键不会过期,返回-2 表示该键已过期:

对一个已经过期的键值执行 get 会返回 nil 。

设置过期时间成功后,如果想要取消过期时间需要使用 PERSIST 命令:

1.2 注意事项

1. 使用 set 和 setget 命令会清除键的过期时间

对已经已经执行 expire 的键执行 set/setget 会导致 expire 指令失效:

2. 使用 watch 监控一个拥有过期时间的键,键值过期消失将不会被认为键值改变

watch 是事务中的一个命令,用来监视键值是否被修改过。如果在 watch 的期间内,键值过期了,将不会被发送改变通知到 watch 。

二、实现原理

在数据库结构中用一个字典保存了所有设置了过期时间的键值,定义在 redis.hredisDb 结构中:

每当给一个键设置过期时间后,就会在 expires 字典中添加一个键值对,键是设置的要过期的键,值是一个 long long 类型的时间,表示什么时间会过期。

Redis设置键值过期时间

redis 每隔 100 毫秒会扫描一次整个哈希表,把所有过期的时间删除。

三、删除策略

redis 删除过期键值有三种策略:定时删除、惰性删除以及定期删除。

3.1 定时删除

根据 expire 设置的过期时间删除键值,设置定时器设置,不断扫描 expires 记录的键值,时间到了之后就删除。

这种方式对内存来说很友好,因为键值一旦过期了就被删了,不会占用额外的内存空间。但是对 CPU 不友好,因为需要持续扫描所有的过期元素,判断是否过期了,如果过期了就删除,没有过期继续下一次扫描。这个扫描是针对所有键值的,如果给大量的键都设置了过期时间,对 CPU 会造成不小的消耗。

3.2 惰性删除

惰性删除的意思是不根据过期的设置来删除键,也就是说不会扫描定时器,键过期了不立马删除,而是等到下一次 get 的时候删除。

这种方式对 CPU 友好,无需遍历所有的过期键值列表。但是对内存不友好,一旦有键值长期不使用了,会导致内存一直被占用。

3.3 定期删除

定期删除是定时删除和惰性删除的这种策略,即每个一段固定的时间才扫描一次过期列表,把过期了的键删掉。定期删除的关键点在于如何设置删除策略,多久执行一次删除,一秒钟?一分钟?或是一小时?这个要根据实际的业务情况决定。

  最后更新:2020-2-17
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2017 年 12 月 2 日 20:09:12
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/redis/redis-expire.html
redis中的AOF持久化和RDB持久化 Redis

redis 中的 AOF 持久化和 RDB 持久化

一、 AOF 持久化 1.1 实现机制 AOF(Append Only File) 是 redis 持久化方式的一种,它通过把所有 redis 执行过的命令都写入到文件来维持持久化。一旦服务崩溃,则可以重放这些命令...
redis中的键值淘汰策略 Redis

redis 中的键值淘汰策略

当使用的内存到达上限后,redis 提供了 6 种策略来淘汰键值: 策略 描述 volatile-lru 在所有设置了过期时间的键值中根据 LRU 算法淘汰最近最少使用的 allkeys-lru 对数据库中所有...
redis源码分析:链表实现 Redis

redis 源码分析:链表实现

一、链表定义 链表在 redis 中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。 redis 中链表在 adlist.h 和 adlist.c 中实现,只用了 300+行代码...
redis中的发布和订阅 Redis

redis 中的发布和订阅

一、发布和订阅 除了任务队列以外,redis 还有一种基于 「发布/订阅」 模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证