2012-05-30 112 views
4

如何使用排序集從redis獲取多個密鑰的值?REDIS - 獲取多個密鑰的值

zadd Users 0 David 
zadd Users 5 John 
zadd Users 15 Linda 
zrevrange Users 0 -1 withscores 

這將有兩個用戶在裏面。

如何在一個查詢中檢索帶'David'和'Linda'鍵的用戶?

回答

5

有多種無需在Redis中引入新命令即可完成此操作。

例如,您可以填寫一個臨時一套與你有興趣,然後計算臨時設定和zset之間的交叉點的名稱:

multi 
    sadd tmp David Linda ... and more ... 
    zinterstore res 2 tmp Users weights 0 1 
    zrange res 0 -1 withscores 
    del tmp res 
exec 

隨着流水線,這樣只會產生一個往返和你可以在tmp中填入任意數量的輸入參數。

隨着Redis的2.6,你也可以換這些行到服務器端Lua的腳本,最終得到一個命令接受輸入列表,並返回結果你想要的:

eval "redis.call('sadd', 'tmp', unpack(KEYS)); 
     redis.call('zinterstore', 'res', 2, 'tmp', 'Users', 'weights', 0, 1); 
     local res = redis.call('zrange', 'res', 0, -1, 'withscores'); 
     redis.call('del', 'res', 'tmp') ; 
     return res 
    " 2 David Linda 

你可以安全地假設沒有新命令將被添加到Redis,如果它可以很容易地使用腳本實現。

+0

如何在shell中輸入多行lua腳本?我輸入了'eval'redis.call('sadd','tmp',unpack(KEYS));',敲回車,然後出現錯誤(無效的參數);我需要一個特殊字符或末尾的東西來輸入腳本的其餘部分? – raffian

+0

不,我認爲Redis-cli不接受多行腳本。 –

0

你不能用一個命令得到這個。你可以做的最接近得到它在一個響應:

MULTI 
ZSCORE Users David 
ZSCORE Users Linda 
EXEC 

編輯:另外,您也可以保持與用戶的得分並行哈希,並與查詢它

HMGET UserScores David Linda 
+0

因此保持哈希映射和有序集合是一個更好的辦法你說什麼? – musdy

+0

不,這不是「更好」。這只是在一個查詢中實現所需內容的一種方式。 –

+1

我明白了。我猜想這對redis來說可能是一個很好的改進。能夠在一個查詢中檢索多個鍵的值。 – musdy

1

因爲要處理排序的項目,所以使用排序集。你要求的是不使用排序集合作爲排序集合。如果你不關心排序順序,那麼可能是一個有序集合不是你正在尋找的。您已經可以檢索多個密鑰,但不是任意的密鑰。

如果您的主要目標是檢索多個任意鍵,請使用散列和hmget。如果您的主要需求是訪問已排序的集合,請使用排序後的集合,然後執行腳本路徑或管道執行一系列zscore調用。