2012-05-22 65 views
43

我已經簡單的Redis列表鍵=>「supplier_id」Redis的獲取列表的所有值,而不重複,沒有彈出

現在我希望它檢索列表的所有值,而實際上遍歷或從列表

彈出值

實例從現在我已經遍歷Redis的長度

element = [] 
0.upto(redis.llen("supplier_id")-1) do |index| 
    element << redis.lindex("supplier_id",index) 
end 

列表檢索所有的價值可以這樣做沒有迭代 perhap更好Redis的造型。誰能建議

+0

你能描述一下你想用redis列表來做什麼嗎?也許你應該使用不同的密鑰類型。 – eyossi

+0

@eyossi這個想法是創建一個選項標籤,其值爲supplier_id提供的數據庫,因爲在關係數據庫中檢索記錄的代價很高,我們認爲在創建時將redis中的所有supplier_id轉儲並在銷燬時刪除它們從數據庫 – Viren

回答

101

要使用Redis檢索列表中的所有項目,您不需要迭代和獲取每個單獨的項目。這將是非常低效的。

您只需使用LRANGE命令即可一次檢索所有項目。

elements = redis.lrange("supplier_id", 0, -1) 

將返回列表中的所有項目而不更改列表本身。

+2

有沒有辦法以內存有效的方式做到這一點? – nilskp

+1

如果從內存效率來說,你的意思是遞增迭代項目,它可以使用llen實現並在lrange調用上循環,但它會增加往返次數,並且會失去一致性。 –

+0

每次我嘗試這個時,我都會收到錯誤「Invalid argument(s)」 – Ricardo

2

我有點不清楚你的問題,但如果supplier_id是數字,爲什麼不使用ZSET

添加你的價值觀,像這樣:

ZADD suppliers 1 "data for supplier 1" 
ZADD suppliers 2 "data for supplier 2" 
ZADD suppliers 3 "data for supplier 3" 

然後,您可以刪除所有內容(但不包括供應商爲三個),像這樣:

ZREMRANGEBYSCORE suppliers -inf 2 

ZREMRANGEBYSCORE suppliers -inf (3 

那如果你只是想讀取它,也可以非常快地訪問(由供應商ID)。

希望有幫助!

+0

你能提供的文件,肯定它肯定可以幫助 – Viren