2013-11-28 97 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