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

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


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

每个都有这种格式的值 -


1. name ABC

2. salary 1234

3. age 23

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


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


炎炎设计
浏览 195回答 2
2回答

心有法竹

您可以使用 Redis 中的管道来运行多个命令并获取它们的响应。这应该允许您执行多个HGETALL命令。有关更多信息,请参阅文档。不确定您用于 C# 的库是什么,但它应该为您提供一种使用管道的方法。您还可以创建一个 Lua 脚本来遍历 Redis 键并返回最老员工的哈希值。

慕婉清6462132

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