Redis Strings

2024-01-23 16:40:10 浏览数 (1)

原文在这里[1]。

Redis字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是用于Redis键的最简单类型。尽管它们通常用于缓存,但它们还支持额外的功能,让你可以实现计数器并执行位操作。

由于Redis键是字符串,当我们将字符串类型用作值时,实际上是在将一个字符串映射到另一个字符串。字符串数据类型对许多用例都很有用,比如缓存HTML片段或页面。

代码语言:javascript复制
> SET bike:1 Deimos
OK
> GET bike:1
"Deimos"

正如你所见,SETGET命令是设置和检索字符串值的方法。需要注意的是,如果键已经存在,无论其中存储的是什么值,SET将对其进行替换,即使该键与非字符串值关联。即SET执行一种赋值操作。

对于Redis来说,值可以是各种类型的字符串,包括二进制数据,例如,你可以将JPEG图像存储在一个值中。但一个值的大小不能超过512MB。

SET命令有一些有趣的选项,它们作为额外的参数提供。例如,我可以要求在SET键时,只有在键已经存在时才成功:

代码语言:javascript复制
> set bike:1 bike nx
(nil)
> set bike:1 bike xx
OK

有许多其他用于操作字符串的命令。例如,GETSET命令将一个键设置为新值,并将旧值作为结果返回。如果你有一个系统,每当你的网站接收到新访问者时都会使用INCR递增一个Redis键,那你就可以使用这个命令。你可能想要每小时收集这些信息,而不丢失任何一个递增。你可以使用GETSET命令,将键设为新值"0"并读取旧值。

能够在单个命令中设置或检索多个键的值对于减少延迟也是很有用的。因此,有了MSETMGET命令:

代码语言:javascript复制
> mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
OK
> mget bike:1 bike:2 bike:3
1) "Deimos"
2) "Ares"
3) "Vanth"

在使用MGET时,Redis会返回一组变量。

将字符串作为计数器

即使字符串是Redis的基本值,你仍然可以通过它们执行一些有趣的操作。例如,其中之一是原子递增:

代码语言:javascript复制
> set total_crashes 0
OK
> incr total_crashes
(integer) 1
> incrby total_crashes 10
(integer) 11

INCR命令可以将字符串值解析为整数,并将其递增一,最后将获得的值设置为新值。还有其他类似的命令,如INCRBYDECRDECRBY。在内部,它始终是相同的命令,只是以稍微不同的方式执行。

INCR是原子的意思是什么呢?即使多个客户端针对同一键发出INCR命令,它们也永远不会发生竞态条件。例如,永远不会发生这样的情况:客户端1读取 "10",客户端2同时读取 "10",两者都递增为11,并将新值设置为11。最终的值将始终是12,而读取-递增-设置操作是在所有其他客户端不同时执行命令的情况下进行的。

限制

默认情况下,一个Redis String的最大值是512MB。

基础命令

获取、设置Strings

SET 存储一个字符串变量。•SETNX 只有键值不存在时才会存储字符串变量。可用于实现锁。•GET 查询字符串变量。•MGET 在一次操作过程中查询多个字符串变量。

计数器管理

INCRBY 原子地递增(当传递负数时递减)存储在给定键上的计数器。•INCRBYFLOATINCRBY命令类型,用于浮点型数字。

位操作

要在字符串上执行位操作,请参阅位图数据类型[2]文档。

完整的字符串命令在这里[3]。

性能

大多数字符串操作的时间复杂度为O(1),这意味着它们非常高效。然而,要小心SUBSTRGETRANGESETRANGE命令,它们的时间复杂度可能为O(n)。这些随机访问字符串命令在处理大字符串时可能导致性能问题。

替换方案

如果你要将结构化数据存储为序列化的字符串,可以考虑使用Redis哈希[4]或JSON[5]。

更多

•Redis Strings Explained[6]是一段简短而全面的关于Redis字符串的视频解释。•Redis University's RU101[7]详细介绍了Redis字符串。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[8]进行许可,使用时请注明出处。 Author: mengbin[9] blog: mengbin[10] Github: mengbin92[11] cnblogs: 恋水无意[12] 腾讯云开发者社区:孟斯特[13]

References

[1] 这里: https://redis.io/docs/data-types/strings/ [2] 位图数据类型: https://redis.io/docs/data-types/bitmaps [3] 这里: https://redis.io/commands/?group=string [4] 哈希: https://redis.io/docs/data-types/hashes [5] JSON: https://redis.io/docs/stack/json [6] Redis Strings Explained: https://www.youtube.com/watch?v=7CUt4yWeRQE [7] Redis University's RU101: https://university.redis.com/courses/ru101/?_gl=1*10jw5fp*_ga*ODg5NjU0ODAzLjE3MDU0ODEyMTg.*_ga_8BKGRQKRPV*MTcwNTY0NzAzOC40LjEuMTcwNTY1MDM0OS41MS4wLjA.*_gcl_au*MTQzNTAwOTk2LjE3MDU0ODEyMTc.&_ga=2.42344805.130259205.1705572418-889654803.1705481218 [8] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [9] mengbin: mengbin1992@outlook.com [10] mengbin: https://mengbin.top [11] mengbin92: https://mengbin92.github.io/ [12] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/ [13] 孟斯特: https://cloud.tencent.com/developer/user/6649301

0 人点赞