0
在Redis中,我想獲得不在SortedSet中的分數的上限分數(和成員)。如何從Redis中的SortedSet獲得最高限額(分數和成員)?
在Java中,有NavigableSet,我們可以使用E ceiling(E e)以回報這個最小的元素設置大於或等於給定元素或null如果沒有這樣的元素。
有沒有辦法在Redis中做同樣的事情,也許使用SortedSets或其他數據結構?
感謝
在Redis中,我想獲得不在SortedSet中的分數的上限分數(和成員)。如何從Redis中的SortedSet獲得最高限額(分數和成員)?
在Java中,有NavigableSet,我們可以使用E ceiling(E e)以回報這個最小的元素設置大於或等於給定元素或null如果沒有這樣的元素。
有沒有辦法在Redis中做同樣的事情,也許使用SortedSets或其他數據結構?
感謝
可以使用ZRANGEBYSCORE用Lua的腳本。想象一下以下有序集合:
zadd test 1 a
zadd test 2 b
zadd test 4 c
你有得分爲1,2,4 3組的元素和你想打電話ceiling(3)
。將下面的Lua腳本script.lua
:
local key = KEYS[1]
local givenScore = tonumber(ARGV[1])
local scores = redis.call("ZRANGEBYSCORE", key, givenScore, "+inf", "withscores", "limit", 0, 1)
if (scores == nil or #scores<2) then
return nil
end
return tonumber(scores[2])
,並稱之爲:
$ redis-cli eval "$(cat script.lua)" 1 test 3
下面是一些示例與上面的數據集運行:
$ redis-cli eval "$(cat script.lua)" 1 test 2
(integer) 2
$ redis-cli eval "$(cat script.lua)" 1 test 3
(integer) 4
$ redis-cli eval "$(cat script.lua)" 1 test 4
(nil)
感謝杜魯,它是確定你的腳本,但它不適合我的數據。我有13200000個按鍵。將範圍從1變爲-1,然後忽略幾乎所有的東西是不可能的。我可以得出結論:對於redis中的排序集合,沒有「ceiling」或「scalable O(log n max)上限技巧」?如果是這樣,請編輯你的答案,我會接受它:)再次感謝:) – Costin
@Costin現在我明白了。我已經用更有效的解決方案更新了我的答案。它是'O(log(n))',所以應該適合你的情況:) –
我使用這個地理定位。輸入數據是一個字典'range:value':'ip1-ip2':'location'。 IP是一個整數。我想象一個對應於有序集合的鍵,並將分數保持爲'ip2',並將其作爲'位置'的成員。如果我要求'ip2-1',我希望獲得與'ip2'相同的位置(假設ip1小於ip2)。就像Java中的NavigableSet.ceiling(key)一樣:) – Costin