Keyspace
在Redis中管理键:键的过期、扫描、修改和查询键空间
Redis 键是二进制安全的;这意味着你可以使用任何二进制序列作为键,从像 "foo" 这样的字符串到 JPEG 文件的内容。空字符串也是一个有效的键。
关于键的其他一些规则:
- 非常长的键不是一个好主意。例如,一个1024字节的键不仅在内存方面不好,而且因为在数据集中查找键可能需要多次昂贵的键比较。即使手头的任务是匹配一个大值的存在,对其进行哈希处理(例如使用SHA1)是一个更好的主意,特别是从内存和带宽的角度来看。
- 非常短的键通常不是一个好主意。如果你可以写“user:1000:followers”,那么写“u1000flw”作为键就没有什么意义。后者更具可读性,并且与键对象本身和值对象使用的空间相比,增加的空间很小。虽然短键显然会消耗更少的内存,但你的工作是找到正确的平衡。
- 尽量坚持使用一种模式。例如,"object-type:id" 是一个好主意,如 "user:1000"。点或破折号通常用于多词字段,如 "comment:4321:reply.to" 或 "comment:4321:reply-to"。
- 允许的最大密钥大小为512 MB。
修改和查询键空间
有些命令并未在特定类型上定义,但为了与键空间进行交互非常有用,因此可以用于任何类型的键。
例如,EXISTS
命令返回 1 或 0 来表示给定键是否存在于数据库中,而 DEL
命令则删除一个键及其关联的值,无论该值是什么。
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
从示例中你还可以看到DEL
本身如何根据键是否被移除(它存在)或未被移除(没有这样的键名)返回1或0。
有许多与键空间相关的命令,但以上两个是最基本的,连同TYPE
命令一起,该命令返回存储在指定键中的值的类型:
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none
密钥过期
在继续之前,我们应该看看一个重要的Redis功能,无论你存储的是什么类型的值,它都能工作:键过期。键过期允许你为键设置一个超时时间,也称为“生存时间”或“TTL”。当生存时间结束时,键会自动被销毁。
关于密钥过期的几个重要注意事项:
- 它们可以使用秒或毫秒精度进行设置。
- 然而,过期时间分辨率始终为1毫秒。
- 关于过期的信息会被复制并持久化到磁盘上,即使你的Redis服务器保持停止状态,时间实际上也会流逝(这意味着Redis会保存一个键将过期的日期)。
使用EXPIRE
命令来设置键的过期时间:
> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)
键在两个GET
调用之间消失了,因为第二个调用延迟了超过5秒。在上面的例子中,我们使用了EXPIRE
来设置过期时间(它也可以用来为一个已经有过期时间的键设置不同的过期时间,就像PERSIST
可以用来移除过期时间并使键永久持久化)。然而,我们也可以使用其他Redis命令来创建带有过期时间的键。例如,使用SET
选项:
> set key 100 ex 10
OK
> ttl key
(integer) 9
上面的例子设置了一个键,其字符串值为 100
,并设置了十秒的过期时间。随后调用了 TTL
命令来检查该键的剩余生存时间。
为了以毫秒为单位设置和检查过期时间,请查看PEXPIRE
和
PTTL
命令,以及SET
选项的完整列表。
导航键空间
扫描
要以高效的方式逐步迭代Redis数据库中的键,你可以使用SCAN
命令。
由于SCAN
允许增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而不会像KEYS
或SMEMBERS
这样的命令那样,当针对大量键或元素调用时,可能会长时间(甚至几秒钟)阻塞服务器。
然而,虽然像SMEMBERS
这样的阻塞命令能够提供在给定时刻属于集合的所有元素。
SCAN
系列命令仅对返回的元素提供有限的保证,因为我们逐步迭代的集合在迭代过程中可能会发生变化。
键
另一种遍历键空间的方法是使用KEYS
命令,但这种方法应谨慎使用,因为KEYS
会阻塞Redis服务器,直到所有键都返回。
警告: 请将KEYS
视为一个命令,仅在生产环境中极其谨慎地使用。
KEYS
在针对大型数据库执行时可能会影响性能。
此命令旨在用于调试和特殊操作,例如更改您的键空间布局。
不要在您的常规应用程序代码中使用 KEYS
。
如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 SCAN
或 sets。
支持的全局样式模式:
h?llo
匹配hello
,hallo
和hxllo
h*llo
匹配hllo
和heeeello
h[ae]llo
匹配hello
和hallo,
但不匹配hillo
h[^e]llo
匹配hallo
,hbllo
, ... 但不匹配hello
h[a-b]llo
匹配hallo
和hbllo
如果你想逐字匹配特殊字符,请使用\
来转义它们。