2015-01-31 72 views
2

我想存儲項目列表,篩選項目,然後按範圍移動結果。通過散列篩選列表

如何修改以下查詢以僅返回display = true的項目?

HSET item1 display true 
HSET item2 display false 
HSET item3 display true 

LPUSH items item1 
LPUSH items item2 
LPUSH items item3 

LRANGE items 0 3 
-- returns [item3, item2, item1] 

回答

1

如果你感興趣的是表達一種布爾屬性,只需使用常規套件。添加項目與SADD items:display item1 item3和讓他們回來是微不足道的SMEMBERS

注意1:您需要考慮任何Redis命令的複雜性,特別是當您的N很大時(更多集合成員,更長列表...)。 SMEMBERS可以運行很長時間,以防你的設置很大,所以你應該考慮使用更有禮貌的SSCAN變種。

注2:如果您還想要執行集合運算(例如聯合,相交),則集合(和排序集合)非常有用。

注3: Sorted Sets是一組超常的Sets(:)),所以當然你可以使用它們來達到同樣的效果,但是保持0或1的分數是有點浪費的IMO。

注意4:您探索的另一個可能的方向是使用位圖來存儲布爾值--Redis在該域中提供了大量的功能。

讓我知道你是否需要更多的想法。

1

Redis實際上沒有辦法從基於哈希值的列表中獲取數據。但是你可以通過使用一個有序集來關閉它。而不是存儲true/false將true和1對齊,然後將false作爲0.然後將您的元素添加到已排序的集合中。

zadd items 1 item1 
zadd items 0 item2 
zadd items 1 item3 

我們得到的物品,其中顯示== 1(真)

zrangebyscore items 1 1 

它會返回[項目1,項目3]

+1

一個可行的,但稍微浪費的解決方案海事組織 - 見我的答案注3。 – 2015-02-01 09:24:06