2017-02-28 26 views
1

我在Redis中有一個Sorted Set,它按照分數存儲我的數據,並且一切正常。Redis:將前n個元素相對於排序集中的給定元素獲取

得分是時間序列,數據是一個字符串ID。我想要的是讓前3個元素相對於按時間排序的給定元素。

舉個例子,我的有序集合"ids_by_time"包含這些數據(通過反得分排序):

50000 "rev75" 
49055 "rev95" 
49050 "rev25" 
49025 "rev11" 
49015 "rev500" 
49000 "rev1" 
48105 "rev22" 
48000 "rev300" 
47999 "rev74" 
47345 "rev33" 
47255 "rev11" 
46288 "rev5" 

是否有可能與此查詢Redis的有序集合去獲得前3個在以"rev1" ?在這種情況下,結果將按此順序爲"rev22", "rev300" and "rev74"(相反)?

回答

3

是的,有可能做到這一點。一種方法是閱讀文檔並找出它。另一種方法是在SO上提出一個問題,並希望有人來協助。

要完成上述操作,首先需要知道「給定元素」的等級 - 這可以通過ZREVRANK命令輕鬆獲得。然後,使用回覆來計算相關元素的範圍排名,並通過ZREVRANGE獲得它,即如果排名爲n,則需要爲接下來的3個元素使用n+1n+3的範圍。像這樣:

127.0.0.1:6379> ZREVRANGE ids_by_time 0 -1 
1) "rev75" 
2) "rev95" 
3) "rev25" 
4) "rev500" 
5) "rev1" 
6) "rev22" 
7) "rev300" 
8) "rev74" 
9) "rev33" 
10) "rev11" 
11) "rev5" 
127.0.0.1:6379> ZREVRANK ids_by_time rev1 
(integer) 4 
127.0.0.1:6379> ZREVRANGE ids_by_time 5 7 
1) "rev22" 
2) "rev300" 
3) "rev74" 

你總是可以將它包裝在一個Lua腳本中,以確保原子性和最小的網絡流量。例如:

~$ cat script.lua 
local rank = redis.call('ZREVRANK', KEYS[1], ARGV[1]) 
return redis.call('ZREVRANGE', KEYS[1], rank+1, rank+tonumber(ARGV[2])) 
~$ redis-cli --eval script.lua ids_by_time , rev1 3 
1) "rev22" 
2) "rev300" 
3) "rev74" 
+0

太棒了!謝謝 –

相關問題