2015-10-02 422 views
5

我有兩個排序集合,並且想要交集,即。 (age BETWEEN 25, 35) AND (salary BETWEEN 250, 350)兩個或多個排序集合的交集

有關於效率比一個更好的辦法:

ZUNIONSTORE t_age 1 age WEIGHTS 1 
ZREMRANGEBYSCORE t_age -inf (25 
ZREMRANGEBYSCORE t_age (35 +inf 
ZINTERSTORE result 2 salary t_age WEIGHTS 1 0 
ZRANGEBYSCORE result 250 350 
+1

你的意思是'ZINTERSTORE結果2薪水t_age重量1 0 '與零? – thepirat000

+0

存儲結果的假設命令ZRANGEBYSCORESTORE將有助於彙總數據。還有ZREMRANGEBYSCORE的獨家版本... – thepirat000

+0

查看[this](https://groups.google.com/forum/#!searchin/redis-db/ZRANGEBYSCORE/redis-db/8TBbISxd244/Rtl5VNdQWAMJ) – thepirat000

回答

3

你應該先檢查其ZSET具有較少的元素與ZCARD,並克隆和修剪較短的一個。

其次,你將剩下2個剩菜。您可以重複使用相同的輔助ZSET以進行更快速的清理。

我也想爲克隆建議DUMPRESTORE,但對於排序集的情況,ZUNIONSTORE實際上要快得多。 這裏有兩個用於設置1M元素的時序:

1) 1) (integer) 14 
    2) (integer) 1444165498 
    3) (integer) 936762 
    4) Complexity info: N:1000000,M:1000000 
    5) 1) "ZUNIONSTORE" 
     2) "temp3" 
     3) "1" 
     4) "temp1" 
     5) "WEIGHTS" 
     6) "1" 
2) 1) (integer) 13 
    2) (integer) 1444165421 
    3) (integer) 3166360 
    4) 
    5) 1) "evalsha" 
     2) "48286113cfe4b389d516e98646e5f4e086decc34" 
     3) "2" 
     4) "temp1" 
     5) "temp2" 
     6) "0" 
+1

這實際上就是我想到的初步答案。雖然基數的評論很重要,但我猜測給定的年齡/薪水背景下,兩組都有相同的成員。但後來我想到了基準測試之後的其他更好的功能。我打算在即將到來的Redis Developers Day上分享這個...請繼續關注:) –

+0

@ItamarHaber是否包含lua腳本? –

+0

目前,是的。 –

4

所以我有想法是使用不同的數據結構,即四叉樹,以更有效地實現相同類型的查詢。你可以看到我使用「面向對象」Lua製作的小POC(Redis Quadtree):https://gist.github.com/itamarhaber/c1ffda42d86b314ea701

注意:你應該知道這在Redis開發者日之前,之中和之後引發了一個非常有趣的討論。中間結果是新的indexing page,但在不久的將來,Redis可能會添加一個更高級的API,這將使n維索引變得不重要。

+1

那會很棒; tnx幫助此功能進入Redis核心。 –