在一次调用中从 Redis 读取多个哈希

Reading multiple Hashes from Redis in one call

我想从 Redis 的多个哈希中搜索具有最高值的键。我的密钥是这种格式 -

emp:1, emp:2,...emp:n

每个都有这种格式的值 -

1. name ABC
2. salary 1234
3. age 23

我想从这些 Hashes 中找到最老的员工。根据我对 Redis 的了解,无法在一次调用中读取多个哈希值。这意味着我需要遍历所有 emp 键并在每个键上调用 HGETALL 以获得所需的结果(我确实有一个存储所有 emp id 的集合)。

有没有一种方法可以最大限度地减少点击次数以使其正常工作?

您可以在 Redis 中使用管道 运行 多个命令并获得它们的响应。这应该允许您执行多个 HGETALL 命令。有关详细信息,请参阅 docs。不确定您为 C# 使用的是什么库,但它应该为您提供一种使用管道的方法。

您还可以创建一个 Lua 脚本来迭代 Redis 键和 return 最老员工的哈希值。

tldr;

是的,你是对的

... there is no way to read multiple hashes in one call ...

也是

... You could also create a Lua script to iterate over the Redis keys ...

添加到它

看来您正在使用 Redis 作为数据库。您已经存储了所有域数据,现在您想要查询它。这是对 Redis 的误用。可以做到,但这不是它的目的。对于这个activity,如果你使用一个真正的数据库,它会更容易和更高效。

Redis 用于缓存常用数据[注:1]。请注意两个词 (1) 缓存和 (2) 经常使用。 缓存就是暂时存储。如果你想要永久存储 - 在服务器重启后 - 去一个数据库。 Frequently-used 表示不要将所有数据存储在那里。仅存储正在使用的子集。您可以将 Redis 用于所有数据,甚至可以打开永久存储,但是您必须非常小心。

为了您的目的,似乎使用通用数据库 SELECT MAX(age) FROM ... 即使不是更好也同样好。

或者,

您只引用了部分真实问题,实际上您遵循了 Redis 最佳实践。在那种情况下,我会建议有一个单独的 Sorted Set。对于插入主键集中的每个员工,还执行 ZADD employeeages 80 Alen,其中 80 是年龄,Alen 可能是艾伦的 ID。

要获取最大年龄的人(的 ID),您可以

ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1

如果这看起来很奇怪,那么您是对的 - 这是一件非常有趣的事情!这不仅会在单个调用中获取您的数据,而且会在该调用中的单个 step 中获取数据!考虑一下:假设您有 100 万名员工 (waao)。那么这种获取最老员工的方法将是最快的,使用数据库,SELECT MAX(... 将是亚军,而您的 HGETALLLua script 将是最慢的。

如果您的员工的年龄经常变化 - 例如在线游戏玩家的分数 并且 您经常想要查询最高或最低 - 例如更新排行榜。使用这种方法代替数据库的缺点是冗余度高。当(比如说)员工的地址发生变化时,您需要更改很多记录,为此您需要拨打很多电话。


[1] 如评论中所述,Redis 不仅仅是常用数据的缓存。我相信对于这次讨论,这个定义就足够了。