2013-11-28 98 views
1

我使用已經設置哈希表的幾個項目:匹配列表,利用哈希表

RPUSH itemList:0 A 
RPUSH itemList:0 B 
RPUSH itemList:0 C 

HSET items item:A A_VALUE 
HSET items item:B B_VALUE 
HSET items item:C C_VALUE 

我目前使用:

LRANGE itemList:0 0 5 

要回到項目["A", "B", "C"]列表

我該如何修改它以使對象返回{"A":"A_VALUE", "B":"B_VALUE", "C":"C_VALUE"}

回答

1

沒有腳本,沒有辦法做到這一點。

如果您的Redis版本小於2.6,只能用這樣的代碼(簡單的PHP版本)來完成:

$data = $redis->lRange('itemList:0', 0, 5); 

$valueKeys = array_map(
    function($key) { 
     return 'item:' . $key; 
    } 
    , array_unique($data) 
); 

$values = $redis->hMGet('items', $valueKeys); 
$ret = []; 
foreach ($data as $key) { 
    $ret[$key] = $values['item:' . $key]; 
} 

如果您正在使用Redis的2.6+,你可以寫LUA存儲過程來獲取數據(與php邏輯相同)。

+0

好的。我使用帶'nginx'的'lua-resty-redis'來進行這些數據庫調用。這看起來挺直接的,明天我會試試看。我的'物品'清單最終可能會因hGetAll最佳化而過長。也許我會爲每個LRANGE結果運行一個HGET,但是,這是很多數據庫調用。 – arby

+1

它只是簡單的樣品。如果你的HASH有許多鍵,你可以使用HMGET來獲取你的LRANGE查詢中存在的鍵。只有2個數據庫調用。編輯我的答案以顯示這種方式。 – misterion