文档:字符串

字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是您可以与 Valkey 键关联的最简单的值类型。它们通常用于缓存,但它们也支持附加功能,让您实现计数器和执行位操作。

由于 Valkey 键是字符串,当我们也将字符串类型用作值时,我们正在将一个字符串映射到另一个字符串。字符串数据类型适用于多种用例,例如缓存 HTML 片段或页面。

127.0.0.1:6379> SET bike:1 Deimos
OK
127.0.0.1:6379> GET bike:1
"Deimos"

如您所见,使用 SETGET 命令是设置和检索字符串值的方式。请注意,如果键已存在,即使该键与非字符串值相关联,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”并读回旧值。

在单个命令中设置或检索多个键的值的能力对于降低延迟也很有用。因此存在 MSETMGET 命令。

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 命令将字符串值解析为整数,将其递增一,最后将获得的值设置为新值。还有其他类似的命令,如 INCRBYDECRDECRBY。在内部,它始终是同一个命令,只是以略有不同的方式执行。

INCR 是原子性的意味着什么?这意味着即使多个客户端对同一个键发出 INCR 命令,也永远不会发生竞态条件。例如,永远不会出现客户端 1 读取“10”,客户端 2 同时读取“10”,两者都递增到 11,然后将新值设置为 11 的情况。最终值将始终是 12,并且读取-递增-设置操作是在所有其他客户端不同时执行命令的情况下完成的。

限制

默认情况下,单个字符串的最大大小为 512 MB。

基本命令

获取和设置字符串

  • SET 存储字符串值。
  • SETNX 仅在键不存在时才存储字符串值。对于实现锁很有用。
  • GET 检索字符串值。
  • MGET 在单个操作中检索多个字符串值。

管理计数器

  • INCRBY 原子性地递增(传递负数时递减)存储在给定键处的计数器。
  • 对于浮点计数器,存在另一个命令:INCRBYFLOAT

位操作

要对字符串执行位操作,请参阅 位图数据类型 文档。

查看 字符串命令的完整列表

性能

大多数字符串操作都是 O(1) 复杂度,这意味着它们非常高效。但是,请注意 SUBSTRGETRANGESETRANGE 命令,它们可能是 O(n) 复杂度。这些随机访问字符串命令在处理大型字符串时可能会导致性能问题。

替代方案

如果您将结构化数据存储为序列化字符串,您可能还会考虑 Valkey 哈希