二进制安全字符串和二进制不安全字符串有什么区别?

时间:2013-11-14 22:53:19

标签: string redis

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

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

3 个答案:

答案 0 :(得分:8)

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

HTH, Swanand

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:0)

Binary-safe表示字符串可以包含任何字符,而Binady-unsafe不能包含任何字符。例如C语言中的'\ 0','\ 0'是字符串的结尾,表示'\ 0'之后的字符和'\ 0'之前是两个字符串

相关问题