键空间
管理 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)
由于第二次调用延迟了 5 秒以上,因此两次调用之间密钥消失了GET。在上面的例子中,我们使用了EXPIRE设置过期时间(它还可用于为已经具有过期时间的密钥设置不同的过期时间,例如PERSIST可用于删除过期时间并使密钥永久保留)。但是,我们也可以使用其他 Redis 命令创建具有过期时间的密钥。例如使用SET选项:
> set key 100 ex 10
OK
> ttl key
(integer) 9
上述示例设置了一个字符串值为 的键100,其有效期为 10 秒。稍后TTL将调用该命令来检查该键的剩余生存时间。
为了设置和检查以毫秒为单位的到期时间,请检查PEXPIRE和PTTL命令以及SET选项的完整列表。
导航键空间
扫描
要以有效的方式逐步迭代 Redis 数据库中的键,您可以使用该SCAN命令。
由于SCAN允许增量迭代,每次调用仅返回少量元素,因此它可以在生产中使用,而不会出现或之类的命令的缺点,KEYS当SMEMBERS针对大量键或元素进行调用时,可能会长时间(甚至几秒钟)阻塞服务器。
然而,虽然诸如 之类的阻塞命令SMEMBERS能够在给定时刻提供集合中的所有元素,但该SCAN命令系列仅对返回的元素提供有限的保证,因为我们逐步迭代的集合可能会在迭代过程中发生变化。
按键
迭代键空间的另一种方法是使用命令KEYS,但这种方法应谨慎使用,因为KEYS它将阻塞 Redis 服务器,直到返回所有键为止。
警告:请将此KEYS命令视为仅应在生产环境中小心使用的命令。
KEYS针对大型数据库执行时可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。请勿KEYS在常规应用程序代码中使用。如果您正在寻找在键空间子集中查找键的方法,请考虑使用SCAN或设置。
支持的 glob 样式模式:
h?llo匹配hello,hallo并且hxlloh*llo比赛hllo和heeeelloh[ae]llo匹配helloandhallo,但不匹配hilloh[^e]llo匹配hallo,,hbllo...但不匹配helloh[a-b]llo比赛hallo和hbllo
\如果想要逐字匹配特殊字符,请使用转义特殊字符。