10

我正在阅读 redis manifesto[1],似乎 redis 只接受二进制安全字符串作为键,但我不知道两者之间的区别。任何人都可以用一个例子来解释吗?

[1] http://oldblog.antirez.com/post/redis-manifesto.html

4

3 回答 3

10

根据Redis 文档,简单的 Redis 字符串具有语法"+redis_response\r\n",而批量 Redis 字符串具有语法"$str_len\r\nbinary_safe_string\r\n"。换句话说,Redis 中的二进制安全字符串可以包含任何数据,就像"foo"任何二进制数据一样简单,512MB比如 JEPG 图像。二进制安全字符串的长度编码在其中,并且不以任何特定字符结尾,例如以 .结尾的NULL终止字符串。C'\0

HTH,斯旺南德

于 2017-03-07T09:16:59.313 回答
6

我对所讨论的系统不熟悉,但术语“二进制安全字符串”可能用于描述某些字符串存储类型或描述特定的字符串实例。在二进制安全字符串类型中,长度为 N 的字符串可用于封装范围为 0-255 或 0-65535(分别为 8 位或 16 位类型)的 N 值的任何序列。二进制安全字符串实例可能是其表示可以细分为大小一致的片段,每个片段代表一个字符,这与不同字符需要不同存储空间量的字符串实例不同。

某些字符串类型(不是二进制安全的)将对某些字符使用可变长度表示,并且如果被要求对例如包含“多部分字符的前半部分”代码的字符串进行操作,则会表现得很奇怪除了“多部分字符的后半部分”。此外,一些处理字符串的代码会假设第 N 个字符将存储在第 N 个字节或第 N 对字节中,如果给定一个字符串,例如第 8 个字符存储在第 12 个和第 13 对字节。

仅简要查看提供的链接,我猜它是redis说不希望仅使用使用不同字节数来保存不同字符的字符串,尽管我不太清楚它是否假设字符串类型将能够处理任何可能的字节序列,或者是否假设它给出的任何字符串实例都可以安全地视为字节序列。不过,我认为感兴趣的基本概念是(1)一些字符串类型使用可变长度编码,而另一些则没有;(2) 即使在使用可变长度编码的类型中,有用的字符串实例子集也只会包含固定长度的字符。

于 2013-11-14T23:26:19.690 回答
1

二进制安全意味着字符串可以包含任何字符,而二进制不安全则不能,例如 C 语言中的 '\0'。'\0' 是字符串的结尾,这意味着 '\0' 和 '\0' 之前的字符将被视为两个不同的字符串。

于 2018-09-18T09:45:28.700 回答