当前位置: 首页 > 面试题库 >

在Redis的排行榜中过滤类别

田巴英
2023-03-14
问题内容

我正在使用Redis和排序集来创建游戏排行榜,并且已经设法使基本版本正常运行。我想知道是否可以进一步过滤类别?例如,假设我正在全球范围内跟踪用户的分数,并且每个用户都有一个国家/地区字段来指定他们来自何处。

是否可以在我要从特定国家(而不是整个数据库)中抽取前10名用户的地方进行过滤?


问题答案:

是的,这是可能的,但是这样做会增加应用程序层的复杂性和数据级别的存储。由于Redis是键/值存储库-
在多个条件(国家,游戏级别,性别,每日/每周/每月的最高用户)上进行查询表明您可能需要针对此问题的另一种解决方案。当您需要查询多个字段时,您会不断对数据进行非规范化处理,以满足业务需求。Redis并不是解决这类问题的最佳解决方案之一。

Cassandra(宽列存储,NoSQL数据库)或PostgreSQL(RDBM)将是此阶段要考虑的解决方案。您可以继续写/更新到Postgres,并将结果缓存到Redis给定的时间。

如果要在Redis中实现此功能;您需要将国家/地区语言环境用作键的一部分。

您将具有users用于跟踪全球用户的键users:it,并且将具有诸如的键,users:es以便根据用户所在的国家来跟踪他们。每当您设置/更新用户时,您都需要在用户所在的国家/地区中设置/更新他们。

127.0.0.1:6379> zadd users 15 a
(integer) 1
127.0.0.1:6379> zadd users:it 15 a
(integer) 1
127.0.0.1:6379> zadd users 23 b 34 c
(integer) 2
127.0.0.1:6379> zadd users:es 23 b 34 c
(integer) 2
127.0.0.1:6379> zrevrange users 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> zrevrange users 0 -1 withscores
1) "c"
2) "34"
3) "b"
4) "23"
5) "a"
6) "15"
127.0.0.1:6379> zrevrange users:it 0 -1 withscores
1) "a"
2) "15"
127.0.0.1:6379> zrevrange users:es 0 -1 withscores
1) "c"
2) "34"
3) "b"
4) "23"
127.0.0.1:6379> zadd users 45 b
(integer) 0
127.0.0.1:6379> zadd users:es 45 b
(integer) 0
127.0.0.1:6379> zrevrange users:es 0 -1 withscores
1) "b"
2) "45"
3) "c"
4) "34"
127.0.0.1:6379> zrevrange users 0 -1 withscores
1) "b"
2) "45"
3) "c"
4) "34"
5) "a"
6) "15"
127.0.0.1:6379>

这种解决方案的问题之一是,当您需要其他条件来列出用户时,需要将所有现有用户迁移到新系统中,数据大小将大大增加。



 类似资料:
  • 问题内容: 我正在使用Redis创建排行榜,并试图找到一种方法来与获得相同高分的玩家打交道(具有相同高分的玩家应按先获得该高分的顺序排序) 我曾想过要做以下事情… 但是,当我执行zrevrange时,时间戳显然将以错误的顺序排列。 输入示例: 输出: 所需的输出: 问题答案: 一种选择是做(将Long.MAX_VALUE更改为时间戳的合理的最高可能值- 一个带符号的64位int将存储大约3亿年的毫

  • 获取全站粉丝排行 获取财富达人排行 获取全站收入排行 获取全站粉丝排行 根据全站的用户粉丝数进行的排序 GET /ranks/followers 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ { "id": 1, "name": "baishi"

  • 获取资讯排行 获取资讯排行 根据一定时间内的资讯获得的浏览量量进行的排序 GET /news/ranks 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ {

  • 获取解答排行 获取问答达人排行 获取社区专家排行 获取解答排行 根据一定时间内发布的回答数进行的排序 GET /question-ranks/answers 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 H

  • 获取动态排行 获取动态排行 根据一定时间内的动态获得的点赞量进行的排序 GET /feeds/ranks 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ {

  • 我在play store上发布并运行了一款libGDX游戏,但我在游戏中实现排行榜时遇到了问题。我已经尝试了互联网上所有可用的方法,例如: LibGDX中的Google Play游戏服务 谷歌玩游戏服务教程示例 如何使用android studio在libgdx中设置google play游戏服务 我可能已经浏览了Google的所有资料,设置了排行榜、应用程序id和成就id,并通过Google p