2014-01-13 34 views
1

我有超過500萬個鍵值對存儲在REDIS服務器中。我們需要在REDIS服務器中搜索的傳入密鑰將類似於「key_num_id」的格式。與REDIS匹配的最長前綴具有超過500萬個鍵值對

鍵和值存儲在REDIS服務器中,如「key_pfx_id」格式。所有密鑰都是唯一密鑰(兩個密鑰不會相同)。以下是幾個例子:

key_1234_11 
key_123_12 
key_123_11 
key_12_11 
.. 
.. 

其中1234,123,12 NUM的傳入關鍵key_num_id的前綴。現在

,例如,如果我們得到key_1234567890_11作爲輸入鍵,然後Redis的應該給對應「key_1234_11」這對於「NUM」的最佳匹配,我們在進入關鍵了「1234567890」在我們的例子中。

其中一種方法是查詢REDIS服務器多次,直到我們得到該值;例如

GET key_1234567890_11 
GET key_123456789_11 
GET key_12345678_11 
GET key_1234567_11 
. 
. 

但我認爲這是昂貴的解決方案,因爲我在一秒鐘左右接近2000個傳入密鑰。所以想要有優化的解決方案。在這個任何人都可以幫助我在Redis的是新手

注:我都做上面的C代碼,你可以到Redis的一個來完成這一

回答

0

一種方法是把迭代邏輯在一個Lua腳本中。

local input = KEYS[1] 
local key, output 
while string.len(input) > 1 do 
    key = "test_" .. input .. "_11" 
    output = redis.call("GET", key) 
    if output then return output end 
    input = string.sub(input, 1, string.len(input) - 1) 
end 
return nil 

調用時(redis.eval(script_body, ["12345678"]))它應該返回正確的key_1234_11值。這顯然是一個微不足道的例子,需要進一步爲您的應用量身定製。

這可以節省多次調用redis的開銷,但是,我猜想與C相比,Lua本身可能會帶來一些開銷。我無法確定Lua腳本在這種情況下會更快,但它可能是。