一尘不染

在Redis的排行榜中过滤类别

redis

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

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


阅读 254

收藏
2020-06-20

共1个答案

一尘不染

是的,这是可能的,但是这样做会增加应用程序层的复杂性和数据级别的存储。由于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>

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

2020-06-20