Redis:多个排序集中的成员的分页有序 zrank 获取

标签 redis

Redis 新手。需要一些帮助。

用例: 我有成千上万的排行榜。他们的用户名中有适当的分数。一个用户可以属于 1 个或多个排行榜。我需要一种有效的方法来获取特定用户所属的每个排行榜的排名,最好按排名和分页排序。典型的用户将属于数百个排行榜。

据我所知: 我为每个用户保留了一组,其中包含他所属的板。为了获得用户的排名,我得到了他的一组板,然后对组中的每个板进行 zrank,然后在我的代码中按排名排序。这看起来效率很低,而且不支持分页。

我一直在阅读和集思广益,但我被困住了。我需要的是这样的:

user1:boards (a,c,e)
board:a (user1,user23,user5)
board:b (user2,user7,user12)
board:c (user2,user1,user42)
board:d (user36,user4,user9)
board:e (user6,user19,user1)

SORT user1:boards BY board:*->user1

类似于按散列字段排序,除了 -> 在这种情况下表示提供的成员的排序集合分数。如果存在这样的功能,性能会有所提高吗?还是与流水线化所有 zrank 相同?

谢谢。

最佳答案

为了提高读取效率,您只需对写入进行微小的更改。 当前,您正在将用户板存储在一个集合中,而是将它们存储在一个已排序的集合中。让我们称之为 user_boards_sorted_set。 因此,每当您在排行榜排序集(例如 board1)中增加用户 1 的分数时,您都会在 board1 上为用户 1 运行 zrank,并且该排名成为 user_boards_sorted_set 中 user1 的分数。 这样 user_boards_sorted_set 始终包含用户所属的所有板,并且每个条目的分数包含他在该特定排行榜中的排名。在 user_boards_sorted_set 上运行 ZRANGE,您将让用户及其在所有排行榜中的排名按排名排序。

更新:基于评论中的反馈,以及上述答案中的错误假设。

另一个好方法是使用 Lua 脚本通过对用户所属的所有看板执行 ZRANK 并在 LUA 本身中对其进行排序来获得个人看板排名。这将带来显着的性能提升,因为所有 ZRANKS 和排序都是在服务器端本身完成的,并减少了网络传输。

关于Redis:多个排序集中的成员的分页有序 zrank 获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404375/

相关文章:

来自 python 的 redis 在 cli 中显示

node.js - 防止在不需要授权时在 Redis 中创建 session

javascript - Redis 命令都是异步的吗?

mongodb - 为什么使用 Redis 而不是 MongoDb 进行缓存?

laravel - 在 Redis 中使用标签缓存键会降低性能

asp.net-core - 在启动期间注册 OpenTelemetry 并在运行时动态添加更多功能

在 Linux 上使用 Redis 编译 C 代码

java - Redis 服务器和 Elasticsearch 集成

python - Redis 作为队列 - 批量检索

使用redis的非orm的django tastypie不返回任何对象