Redis获取给定s的用户集

2024-09-28 20:47:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用redis来实现排行榜。我要说的问题是- 给定一个用户,在排行榜中,他上面有5个用户,下面有5个用户。在

以下是我采取的方法,请告诉我,如果是最佳的,或者可以做一些更好的事情:

1. lower_key = zrank('set_name', 'member_name') // get the position of the user in the set
2. higer_key = zcard('set_name') // the total no. of elements in the leaderboard
3. low = max(0, lkey-5) // edge-case if user rank is less than 5.
4. high = min(key+5, higher_key) // edge-case if user rank lies is top-5
5. zrange('set_name', low, high) // get the range between the intervals. 

zrank is O(log(N))
zcard is O(1)
zrange step is O(log(N)+M) 

有没有更好的方法来做这个手术?在

EIDT:其中一个答案提到了太多的来回切换,因此我添加了一个管道,请看一下实现-

^{pr2}$

请告诉我你的想法。在


Tags: ofthe方法key用户nameinget
1条回答
网友
1楼 · 发布于 2024-09-28 20:47:48

因此,您当前的方法是好的,并且可以工作(除了变量名中的拼写错误),但是需要在您的客户端和redis服务器之间进行大量的来回切换,而这通常就是redis的瓶颈所在。在您的例子中,来回操作是不必要的,因为您实际上可以在一个LUA脚本中执行所有操作,然后从客户端以Redis命令的形式运行该脚本。所有的事情都是在Redis服务器上完成的,只有一个来回,而不是你的3个。在

以下是我在LUA中的操作方法(未经测试):

local key_idx = redis.call("ZRANK", KEYS[1], ARGV[1])
local card_idx = redis.call("ZCARD", KEYS[1])
local low_idx = math.max(0, key_idx-5)
local high_idx = math.min(key_idx+5, card_idx)
local return_arr = redis.call("ZRANGE", KEYS[1], low_idx, high_idx)
return return_arr

你可以从redis调用这个函数为:

^{pr2}$

相关问题 更多 >