首页 > 解决方案 > 在 Redis 中过滤排行榜的类别

问题描述

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

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

标签: pythonredis

解决方案


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

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

如果你想在 Redis 中实现这个;您需要使用国家/地区语言环境作为密钥的一部分。

您将拥有users跟踪全球用户的密钥,并且您将拥有诸如 等之类的密钥users:itusers: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>

这种解决方案的一个问题是,当您需要另一个标准来列出用户时,您需要将所有现有用户迁移到新系统,您的数据量将显着增加。


推荐阅读