我正在使用Redis和排序集来创建游戏排行榜,并且已经设法使基本版本正常运行。我想知道是否可以进一步过滤类别?例如,假设我正在全球范围内跟踪用户的分数,并且每个用户都有一个国家/地区字段来指定他们来自何处。
是否可以在我要从特定国家(而不是整个数据库)中抽取前10名用户的地方进行过滤?
是的,这是可能的,但是这样做会增加应用程序层的复杂性和数据级别的存储。由于Redis是键/值存储库- 在多个条件(国家,游戏级别,性别,每日/每周/每月的最高用户)上进行查询表明您可能需要针对此问题的另一种解决方案。当您需要查询多个字段时,您会不断对数据进行非规范化处理,以满足业务需求。Redis并不是解决这类问题的最佳解决方案之一。
Redis
Cassandra(宽列存储,NoSQL数据库)或PostgreSQL(RDBM)将是此阶段要考虑的解决方案。您可以继续写/更新到Postgres,并将结果缓存到Redis给定的时间。
Cassandra
PostgreSQL
如果要在Redis中实现此功能;您需要将国家/地区语言环境用作键的一部分。
您将具有users用于跟踪全球用户的键users:it,并且将具有诸如的键,users:es以便根据用户所在的国家来跟踪他们。每当您设置/更新用户时,您都需要在用户所在的国家/地区中设置/更新他们。
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>
这种解决方案的问题之一是,当您需要其他条件来列出用户时,需要将所有现有用户迁移到新系统中,数据大小将大大增加。