八Redis 键过期功能

前面介绍了Redis 的六种数据结构,它们分别是字符串、列表、散列、集合、有序集合和 HyperLogLog。
除此之外,我们还介绍了如何使用数据库命令来操作 Redis 的数据库本身:
比如使用 DEL 命令删除数据库中的某个键,
使用 SCAN 命令渐进地遍历整个数据库,
使用 DBSIZE 返回数据库包含的键值对数 量,等等。
在这些数据库功能的基础上,Redis 还提供了一些附加功能,它 们分别是:
键过期功能、
发布与订阅功能
流水线功能
事务功能以及Lua脚本功能。
这些附加功能要么就是用来解决特定问题的,要么就是用来增强数据库功能、使得数据库设置操作能够更好地进行的,接下来会涉及到上面功能

键过期功能
让 Redis 在指定的时间自动删除特定的键。
键过期功能的相关命令


设置生存时间
Redis 提供了两个命令来 设置键的生存时间(TTL,time to live),他们分别是


如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表 示设置成功。
当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生 存时间就减少一毫秒;时间过去一秒钟,键的生存时间就减少一秒钟;以此类推
当一个键的生存时间被减少至低于0时,Redis 就会自动将这个键删除掉。

EXPIRE 示例
[root@testceph ~]# !553
redis-cli 
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> expire msg 5
(integer) 1
127.0.0.1:6379> exists msg
(integer) 1
127.0.0.1:6379> exists msg
(integer) 0

PEXPIRE 示例
127.0.0.1:6379> pexpire number 550000
(integer) 1
127.0.0.1:6379> exists number
(integer) 1
127.0.0.1:6379> exists number
(integer) 0

设置过期时间
Redis 提供了两个命令用于 设置键的过期时间(expire time)

如果给定的键不存在,那么 EXPIREAT 和 PEXPIREAT 将返回 0 ,表示设置失败;如果命令返回 1 , 那么表示设置成功。
对于被设置了过期时间的键来说,当键的过期时间小于当前时间的时候,Redis 就会自动地删除该键

EXPIREAT 示例
127.0.0.1:6379> set msg "time to go"
OK
127.0.0.1:6379> expireat msg 1000000005
(integer) 1
127.0.0.1:6379> exists msg
(integer) 0
127.0.0.1:6379> exists msg
(integer) 0
127.0.0.1:6379> 
pexpireat示例
127.0.0.1:6379> set song "Last Night,Good Night"
OK
127.0.0.1:6379> pexpireat song 1000000005500
(integer) 1
127.0.0.1:6379> exists song
(integer) 0
127.0.0.1:6379>

生存时间和过期时间的区别
设置生存时间和设置过期时间都可以让 Redis 自动删除指定的键,它们的区别在于设置“键什么时候要被删除”的方式不同
    。EXPIRE 和 PEXIRE 的作用是让键在 N 秒钟或者 N 毫秒之后被删除
    。而 EXPIREAT 和 PEXPIREAT 的作用则是让键在指定的 UNIX 时间到达之后被删除
带有生存时间的键就像是一个倒计时器,它会倒数 5、4、3、2、1、0,然后被删掉
而带有过期时间的键则像是一个定时器,它会在指定的时间来临之后被删掉

返回键的剩余生存时间
在为一个键设置过期时间或者生存时间之后,用户可以使用 TTL 命令或者 PTTL 命令查看这个键的剩余生存时间,以此来获知键还有多久才会被 Redis 删除

TTL和PTTL可能会返回三种不同的值

TTL和PTTL示例
127.0.0.1:6379> set msg "hello"
OK
127.0.0.1:6379> expire msg 10086
(integer) 1
127.0.0.1:6379> TTL msg
(integer) 10081
127.0.0.1:6379> PTTL msg
(integer) 10076680
127.0.0.1:6379> set number 10086
OK
127.0.0.1:6379> EXPIREAT number 1408498480
(integer) 1
127.0.0.1:6379> TTL number
(integer) -2
127.0.0.1:6379> PTTL number
(integer) -2
127.0.0.1:6379> 
注意,Redis 并没有提供查看键的过期时间的命令,所 以对于一个设置了过期时间的键来说,我们只能使用 TTL 和 PTTL 来查看它的剩余生存时间


移除键的过期时间或生存时间
PERSIST key
移除为键 key 设置的过期时间或生存时间,使得它不会被 Redis 自动删除。 移除成功时命令返回 1 ;如果命令没有设置过期时间或生存时间,那么命令返回 0 。 复杂度为 O(1)

PERSIST 命令
127.0.0.1:6379> set msg "hello"
OK
127.0.0.1:6379> expire msg 30
(integer) 1
127.0.0.1:6379> TTL msg
(integer) 27
127.0.0.1:6379> PERSIST msg
(integer) 1
127.0.0.1:6379> TTL msg
(integer) -1
127.0.0.1:6379> SET number 10086
OK
127.0.0.1:6379> expireat number 1408499100
(integer) 1
127.0.0.1:6379> TTL number
(integer) -2
127.0.0.1:6379> PERSIST number
(integer) 0
127.0.0.1:6379> TTL number
(integer) -2
127.0.0.1:6379> 
键过期功能的应用
自动更新缓存、自动刷新排行榜、定时删除的用户 Session。
示例:自动更新的缓存

以下是《字符串》一 节介绍过的缓存方法,但这个方法并不实用,因为程序需要通过手动删除旧的 缓存来进行缓存更新,否则程序就会一直使用同一个缓存
@app.route(“/”) 
def index():
  cached_content = GET ‘index’
  if cached_content:
    return cached_content
  else:
    content = fetch_and_create_index() 
    SET ‘index’ content
    return content
以下是使用键过期功能实现的,一个每五分钟就 会自动更新一次的缓存实现:
@app.route(“/”) 
def index():
  cached_content = GET ‘index’ 
  if cached_content:
    return cached_content 
  else:
    content = fetch_and_create_index() 
    SET ‘index’ content
    EXPIRE ‘index’ 5*60
    return content
SETEX 命令
因为
SET key value EXPIRE key seconds
这个模式经常出现,所以 Redis 在 2.0 版本新增了 SETEX 命令: SETEX key seconds value
这个命令相当于原子地 执行 SET 命令和 EXPIRE 命令。



PSETEX 命令
在 Redis 2.6.0 ,Redis 开始支持毫秒精度的 过期时间和生存时间,并增加了相应的 PEXPIRE、
PEXPIREAT、PTTL 三个命令,以及 PSETEX 命令: PSETEX key milliseconds value 执行这个命令相当于原子地 执行以下两个命令: SET key value
PEXPIRE key milliseconds


SET 命令对生存时间的支持
在 Redis 2.6.12 版本,Redis 又对 SET 命令进行了修改,让它支持可选的 EX 参数和 PX 参数:
SET key value [EX seconds] [PX milliseconds]
执行 SET key value EX seconds 相当于执行 SETEX key seconds value ;
而执行 SET key value PX milliseconds 相当于执行 PSETEX key milliseconds value 。
尽管目前 SETEX 和 PSETEX 都能正常使用,但我个人 还是建议尽量使用 SET 而不是 SETEX 或者 PSETEX ,因为使用 SET 来设置生存时间更简洁一些,而比较旧的 SETEX 和 PSETEX 在将来可能会 被废弃。


总结如下:
使用键过期功能可以让 Redis 自动在指定的时间删除特定的键。
让 Redis 自动删除键的方法有两种,一种是 为键设置生存时间,另一种是为键设置过期时间:
• 生存时间就像一个倒计时器,它会随着时间的流逝而不断减少,当生存 时间被减少至低于 0 时,键 就会被删除;
过期时间就像一个定时器,当给定的时间到达之后,键就会被删除。

猜你喜欢

转载自blog.csdn.net/xsjzdrxsjzdr/article/details/85247015
今日推荐