我使用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}$请告诉我你的想法。在
因此,您当前的方法是好的,并且可以工作(除了变量名中的拼写错误),但是需要在您的客户端和redis服务器之间进行大量的来回切换,而这通常就是redis的瓶颈所在。在您的例子中,来回操作是不必要的,因为您实际上可以在一个LUA脚本中执行所有操作,然后从客户端以Redis命令的形式运行该脚本。所有的事情都是在Redis服务器上完成的,只有一个来回,而不是你的3个。在
以下是我在LUA中的操作方法(未经测试):
你可以从redis调用这个函数为:
^{pr2}$相关问题 更多 >
编程相关推荐