2014-08-29 417 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"