2 回答
TA贡献1804条经验 获得超2个赞
你是对的
...无法在一次调用中读取多个哈希值...
所以是@TheDude
...您还可以创建一个 Lua 脚本来迭代 Redis 键...
添加到它
看来您正在使用Redis作为数据库。您已经存储了所有域数据,现在您想要查询它。这是对Redis的滥用。它可以做到,但这不是它的目的。对于此活动,如果您使用真实的数据库,它将更容易且性能更高。
Redis 用于缓存常用数据[注:1]。请注意两个词 (1) 缓存和 (2) 常用。缓存是临时存储。如果您想要永久存储 - 在服务器重新启动后 - 去数据库。常用表示不要将所有数据存储在那里。仅存储正在使用的子集。您可以将 Redis 与您的所有数据一起使用,甚至可以在永久存储打开的情况下使用,但是您必须非常小心。
出于您的目的,它似乎使用通用数据库,并且SELECT MAX(age) FROM ...
即使不是更好也同样好。
或者可能,
您只引用了实际问题的一部分,实际上您正在遵循 Redis 最佳实践。在这种情况下,我建议使用单独的Sorted Set
. 对于插入到主密钥集的每个员工,还要做ZADD employeeages 80 Alen
where80
是年龄和Alen
可能的人 Alen 的 ID。
要获取最大年龄的人(的 ID),您可以执行
ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1
如果这看起来很奇怪,那么您是对的 - 这是非常有趣的事情!这不仅可以在一次调用中获取数据,而且可以在调用中的一个步骤中获取数据!考虑一下:假设您有 100 万名员工 (waao)。那么这种获取最年长员工的方法将是最快的,使用数据库SELECT MAX(...
并将获得亚军,而你的HGETALL
或Lua script
将是最慢的。
如果您的员工的年龄经常变化,请使用这种方法 - 例如在线游戏的玩家分数,并且您经常想查询排名靠前的或较松的 - 比如更新排行榜。使用这种方法代替数据库的缺点是冗余度高。当(例如)员工的地址发生变化时,您需要更改大量记录,为此您需要拨打大量电话。
[1] 正如评论中所指出的,Redis 不仅仅是常用数据的缓存。我相信对于这个讨论,这个定义就足够了。
- 2 回答
- 0 关注
- 194 浏览
添加回答
举报