非常教程

Redis参考手册

键 | Keys

expire

EXPIRE key seconds

自1.0.0起可用。

时间复杂度: O(1)

设置超时key。超时过期后,密钥将自动删除。在 Redis 术语中,有关联超时的密钥通常被认为是不稳定的。

超时只能通过删除或覆盖密钥内容的命令清除,包括 DEL,SET,GETSET 和所有*STORE命令。这意味着所有在概念上改变存储在密钥中的值而不用新密钥替换的操作都会使超时保持不变。例如,使用 INCR 增加一个键的值,用 LPUSH 将一个新值推入一个列表,或者用 HSET 改变一个散列的字段值都是会使超时保持不变的操作。

超时也可以被清除,使用 PERSIST 命令将密钥恢复为持久密钥。

如果使用 RENAME 重命名密钥,则相关的生存时间将转移到新的密钥名称。

如果某个密钥被 RENAME 覆盖,就像现有密钥Key_A被类似的调用覆盖的情况一样RENAME Key_B Key_A,原始的密码是否与Key_A超时相关并不重要,新密钥Key_A将继承所有的特性Key_B

请注意,以非积极的超时或 EXPIREAT / PEXPIREAT 调用带有过去时间的 EXPIRE / PEXPIRE 将导致密钥被删除而不是过期(相应地,发出的关键事件将del不会expired)。

Refreshing expires

可以使用一个已经存在过期集的键作为参数来调用 EXPIRE。在这种情况下,密钥的生存时间会更新为新值。有很多有用的应用程序,下面的导航会话模式部分介绍了一个示例。

Redis之前的差异2.1.3

2.1.3之前的 Redis 版本中,使用改变其值的命令更改具有过期集合的密钥具有完全移除密钥的效果。这种语义是需要的,因为现在已经修复了复制层的限制。

EXPIRE 将返回0,并且不会更改设置了超时的密钥的超时。

返回值

整数回复,具体为:

  • 1 如果超时被设置。
  • 0如果key不存在。

例子

redis> SET mykey "Hello" "OK" redis> EXPIRE mykey 10 (integer) 1 redis> TTL mykey (integer) 10 redis> SET mykey "Hello World" "OK" redis> TTL mykey (integer) -1

模式:导航会话

想象一下你有一个网络服务,并且你对用户最近访问过的最近N个网页感兴趣,这样每个相邻的网页浏览都不会在前一个网页中执行超过60秒。从概念上讲,您可以将这组页面视为用户的导航会话,可能包含有关他或她当前正在查找的产品的有趣信息,以便推荐相关产品。

您可以使用以下策略轻松在 Redis 中对此模式进行建模:每次用户执行页面视图时,都会调用以下命令:

MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC

如果用户空闲时间超过60秒,则该键将被删除,并且只有小于60秒的后续页面查看才会被记录下来。

这种模式很容易修改为使用 INCR 而不是使用 RPUSH 的列表。

过期的钥匙

通常情况下,Redis 密钥创建时没有关联的生存时间。除非用户以明确的方式删除密钥,例如使用 DEL 命令,否则密钥将永远存在。

EXPIRE 系列命令能够将过期与给定密钥相关联,但需要使用密钥所使用的一些额外内存。当密钥设置过期时,Redis 将确保在指定的时间量过去时移除密钥。

使用 EXPIRE 和 PERSIST 命令(或其他严格相关的命令)可以更新或完全删除生存的关键时刻。

到期准确性

在 Redis 2.4中,expire 可能不是精确的,它可能在0到1秒之间。

由于 Redis 2.6 的过期错误是从0到1毫秒。

过期和持久

密钥过期信息存储为绝对 Unix 时间戳(Redis 版本2.6或更高版本以毫秒为单位)。这意味着即使 Redis 实例未处于活动状态,时间仍在流动。

为了过期工作,电脑的时间必须保持稳定。如果您从两台计算机中移动一个RDB文件并在其时钟中执行大的异步操作,可能会发生有趣的事情(例如加载时所有加载的密钥都会过期)。

即使正在运行的实例也会检查计算机时钟,因此,例如,如果您设置的密钥的生存时间为1000秒,然后将计算机的时间设置为将来2000秒,密钥将立即过期,而不是持续1000秒。

Redis 如何过期密钥

Redis 密钥有两种过期方式:被动方式和主动方式。

当某个客户端试图访问密钥时,密钥被动地过期,并且发现密钥超时。

当然这还不够,因为有过期的密钥永远不会被再次访问。无论如何,这些密钥应该过期,因此 Redis 会定期在密钥中随机测试几个密钥并设置过期。所有已过期的密钥都将从密钥空间中删除。

具体来说,这是 Redis 每秒执行10次的操作:

  1. 从关键集合中检测20个随机关键字并带有关联的过期。
  1. 删除所有过期的密钥。
  1. 如果超过25%的密钥过期,请从第1步重新开始。

这是一个微不足道的概率算法,基本上假设是我们的样本代表了整个密钥空间,并且我们继续过期直到可能过期的密钥的百分比低于25%

这意味着在任何给定时刻,已经过期的使用存储器的最大密钥数量最多等于每秒写入操作的最大数量除以4。

如何在复制链接和AOF文件中处理过期

为了在不牺牲一致性的情况下获得正确的行为,当密钥过期时,将在 AOF 文件中合成一个 DEL 操作并获取所有连接的从站。这样,到期过程集中在主实例中,并且不存在一致性错误的可能性。

然而,虽然连接到主服务器的从服务器不会独立使用密钥(但会等待来自主服务器的 DEL),但它们仍会采用数据集中存在的已满过期的完整状态,因此,当从服务器选择为掌握它将能够独立过期,完全充当主人。

Redis

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。 它通常被称为数据结构服务器,因为值( value )可以是 字符串( String ), 哈希(Map),列表(list),集合( sets ) 和 有序集合( sorted sets )等类型。

主页 https://redis.io/
源码 https://github.com/antirez/redis
发布版本 4.0.2

Redis目录

1.集合 | Cluster
2.连接 | Connection
3.Geo
4.Hashes
5.HyperLogLog
6.键 | Keys
7.列表 | Lists
8.Pub/Sub
9.脚本 | Scripting
10.服务器 | Server
11.设定 | Sets
12.排序集 | Sorted Sets
13.字符串 | Strings
14.事务 | Transactions
15.Redis Dump 命令
16.Redis DEL 命令
17.Redis 键(key)
18.Redis 命令
19.Redis 配置
20.Redis 简介
21.Redis RANDOMKEY 命令
22.Redis TTL 命令
23.Redis Pttl 命令
24.Redis PERSIST 命令
25.Redis Move 命令
26.Redis PEXPIREAT 命令
27.Redis Keys 命令
28.Redis Expireat 命令
29.Redis Expire 命令
30.Redis EXISTS 命令
31.Redis Mget 命令
32.Redis Getbit 命令
33.Redis Getset 命令
34.Redis Getrange 命令
35.Redis Get 命令
36.Redis SET 命令
37.Redis 字符串(String)
38.Redis Type 命令
39.Redis Renamenx 命令
40.Redis Rename 命令
41.Redis Incrby 命令
42.Redis Incr 命令
43.Redis Psetex 命令
44.Redis Msetnx 命令
45.Redis Mset 命令
46.Redis Strlen 命令
47.Redis Setrange 命令
48.Redis Setnx 命令
49.Redis Setex 命令
50.Redis Setbit 命令
51.Redis Hincrby 命令
52.Redis Hgetall 命令
53.Redis Hget 命令
54.Redis Hexists 命令
55.Redis Hdel 命令
56.Redis 哈希(Hash)
57.Redis Append 命令
58.Redis Decrby 命令
59.Redis Decr 命令
60.Redis Incrbyfloat 命令
61.Redis Blpop 命令
62.Redis 列表(List)
63.Redis Hvals 命令
64.Redis Hsetnx 命令
65.Redis Hset 命令
66.Redis Hmset 命令
67.Redis Hmget 命令
68.Redis Hlen 命令
69.Redis Hkeys 命令
70.Redis Hincrbyfloat 命令
71.Redis Lrem 命令
72.Redis Lrange 命令
73.Redis Lpushx 命令
74.Redis Lpush 命令
75.Redis Lpop 命令
76.Redis Llen 命令
77.Redis Linsert 命令
78.Redis Lindex 命令
79.Redis Brpoplpush 命令
80.Redis Brpop 命令
81.Redis Sdiff 命令
82.Redis Scard 命令
83.Redis Sadd 命令
84.Redis 集合(Set)
85.Redis Rpushx 命令
86.Redis Rpush 命令
87.Redis Rpoplpush 命令
88.Redis Rpop 命令
89.Redis Ltrim 命令
90.Redis Lset 命令
91.Redis Sunion 命令
92.Redis Srem 命令
93.Redis Srandmember 命令
94.Redis Spop 命令
95.Redis Smove 命令
96.Redis Smembers 命令
97.Redis Sismember 命令
98.Redis Sinterstore 命令
99.Redis Sinter 命令
100.Redis Sdiffstore 命令