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:
确定

拖动滑块以完成验证