2014-08-29 429 views
3

我很难理解如何通过redis使用二进制数据类型。我想要使​​用命令Redis和转义二进制数据

set '{binary data}' 'Alex' 

如果二进制数据实际上包含引号符号或/ r/n,该怎么办?我知道我可以逃避角色,但是有一个我需要逃避的角色正式名单?

+0

你是指从命令行还是? – ControlAltDel 2014-08-29 17:43:22

+0

我正在用cat data.txt |进行批量插入redis-cli - 管道。我在文本文件中有这个命令。 – user1978109 2014-08-29 17:45:31

回答

-1

找到了答案:Redis的是说是安全的“二进制安全字符串”

您需要使用Base64编码的二进制数据得到一个二进制安全的字符串。

Java convert bytes to binary safe string

至于你的问题,想管你Redis的文本命令到CLI,你可能想通过文件来获得和逃避你单引号。

+1

base64编码会膨胀我的数据库大小。我试图在Redis中存储一个48位长的MAC地址作为密钥,而不是它的十六进制写ascii。能够存储为原始二进制文件会将我的密钥大小减半 – user1978109 2014-08-29 18:30:46

+0

有什么我需要为redis转义的字符列表? – user1978109 2014-08-29 21:11:45

+0

我已经给你所有我知道的东西 – ControlAltDel 2014-08-29 22:06:33

0

我发现最好使用Redis协议来做到这一点,因为可以在数据类型之前定义边界。

3

没有必要对数据本身做任何特殊的事情。所有Redis字符串都是二进制安全的。

你的问题涉及到redis-cli(这是一个非常好的redis客户端,用于了解Redis,但由于使用性能问题,几乎从不会在生产中想要什么)。

您的问题还涉及常见(bash/sh/other)终端转义。 Here是一个很好的解释。

我建议你使用python这个,或任何其他你熟悉的语言。

实施例:

import redis 
cli=redis.Redis('localhost', 6379) 
with open('data.txt','rb') as f: 
    for d in f: 
    t = d.partition('\t') 
    cli.set(t[0], t[2].rstrip()) 
#EOF 
0

可以作为散装字符串数组到Redis的发送命令,无需转义字符或Base64编码。因为散装字符串与数据长度开始,Redis的不尝试解析数据字节和而不只是跳到最终验证终端CR/LF对:

*3<crlf> 
$3<crlf>SET<crlf> 
${binary_key_length}<crlf>{binary_key_data}<crlf> 
${binary_data_length}<crlf>{binary_data}<crlf> 
1

任意字节可使用在redis-cli输入十六进制表示法,例如

set "\x00\xAB\x20" "some value"