在一次调用中从 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(...
将是亚军,而您的 HGETALL
或 Lua script
将是最慢的。
如果您的员工的年龄经常变化 - 例如在线游戏玩家的分数 并且 您经常想要查询最高或最低 - 例如更新排行榜。使用这种方法代替数据库的缺点是冗余度高。当(比如说)员工的地址发生变化时,您需要更改很多记录,为此您需要拨打很多电话。
[1] 如评论中所述,Redis 不仅仅是常用数据的缓存。我相信对于这次讨论,这个定义就足够了。
我想从 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(...
将是亚军,而您的 HGETALL
或 Lua script
将是最慢的。
如果您的员工的年龄经常变化 - 例如在线游戏玩家的分数 并且 您经常想要查询最高或最低 - 例如更新排行榜。使用这种方法代替数据库的缺点是冗余度高。当(比如说)员工的地址发生变化时,您需要更改很多记录,为此您需要拨打很多电话。
[1] 如评论中所述,Redis 不仅仅是常用数据的缓存。我相信对于这次讨论,这个定义就足够了。