字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是您可以与 Valkey 键关联的最简单的值类型。它们通常用于缓存,但它们也支持附加功能,让您实现计数器和执行位操作。
由于 Valkey 键是字符串,当我们也将字符串类型用作值时,我们正在将一个字符串映射到另一个字符串。字符串数据类型适用于多种用例,例如缓存 HTML 片段或页面。
127.0.0.1:6379> SET bike:1 Deimos
OK
127.0.0.1:6379> GET bike:1
"Deimos"
如您所见,使用 SET
和 GET
命令是设置和检索字符串值的方式。请注意,如果键已存在,即使该键与非字符串值相关联,SET
也会替换键中已存储的任何现有值。因此 SET
执行的是赋值操作。
值可以是各种字符串(包括二进制数据),例如,您可以在值中存储 JPEG 图像。一个值不能大于 512 MB。
SET
命令有许多有趣的选项,它们作为附加参数提供。例如,我可以要求 SET
在键已存在时失败,或者相反,只在键已存在时才成功。
127.0.0.1:6379> set bike:1 bike nx
(nil)
127.0.0.1:6379> set bike:1 bike xx
OK
还有许多其他用于操作字符串的命令。例如,GETSET
命令将键设置为新值,并返回旧值作为结果。您可以使用此命令,例如,如果您的系统在每次网站收到新访客时都使用 INCR
递增 Valkey 键。您可能希望每小时收集一次此信息,而不会丢失任何一次递增。您可以 GETSET
键,将其新值设置为“0”并读回旧值。
在单个命令中设置或检索多个键的值的能力对于降低延迟也很有用。因此存在 MSET
和 MGET
命令。
127.0.0.1:6379> mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
OK
127.0.0.1:6379> mget bike:1 bike:2 bike:3
1) "Deimos"
2) "Ares"
3) "Vanth"
当使用 MGET
时,Valkey 返回一个值数组。
作为计数器的字符串
即使字符串是 Valkey 的基本值,您也可以对它们执行有趣的操作。例如,其中之一是原子递增。
127.0.0.1:6379> set total_crashes 0
OK
127.0.0.1:6379> incr total_crashes
(integer) 1
127.0.0.1:6379> incrby total_crashes 10
(integer) 11
INCR
命令将字符串值解析为整数,将其递增一,最后将获得的值设置为新值。还有其他类似的命令,如 INCRBY
、DECR
和 DECRBY
。在内部,它始终是同一个命令,只是以略有不同的方式执行。
INCR
是原子性的意味着什么?这意味着即使多个客户端对同一个键发出 INCR
命令,也永远不会发生竞态条件。例如,永远不会出现客户端 1 读取“10”,客户端 2 同时读取“10”,两者都递增到 11,然后将新值设置为 11 的情况。最终值将始终是 12,并且读取-递增-设置操作是在所有其他客户端不同时执行命令的情况下完成的。
限制
默认情况下,单个字符串的最大大小为 512 MB。
基本命令
获取和设置字符串
SET
存储字符串值。SETNX
仅在键不存在时才存储字符串值。对于实现锁很有用。GET
检索字符串值。MGET
在单个操作中检索多个字符串值。
管理计数器
INCRBY
原子性地递增(传递负数时递减)存储在给定键处的计数器。- 对于浮点计数器,存在另一个命令:
INCRBYFLOAT
。
位操作
要对字符串执行位操作,请参阅 位图数据类型 文档。
查看 字符串命令的完整列表。
性能
大多数字符串操作都是 O(1) 复杂度,这意味着它们非常高效。但是,请注意 SUBSTR
、GETRANGE
和 SETRANGE
命令,它们可能是 O(n) 复杂度。这些随机访问字符串命令在处理大型字符串时可能会导致性能问题。
替代方案
如果您将结构化数据存储为序列化字符串,您可能还会考虑 Valkey 哈希。