为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
炎炎设计 2021-12-05 16:52:16
我想从 Redis 的多个散列中搜索具有最高值的键。我的钥匙是这种格式 -emp:1, emp:2,...emp:n每个都有这种格式的值 -1. name ABC2. salary 12343. age 23我想从这些哈希中找到最年长的员工。根据我对 Redis 的了解,无法在一次调用中读取多个哈希值。这意味着我需要遍历所有 emp 键并调用HGETALL每个键以获得所需的结果(我确实有一个存储所有 emp id 的集合)。有没有办法可以最大限度地减少点击次数以使其正常工作?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

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

您还可以创建一个 Lua 脚本来遍历 Redis 键并返回最老员工的哈希值。


查看完整回答
反对 回复 2021-12-05
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

你是对的

...无法在一次调用中读取多个哈希值...

所以是@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(...并将获得亚军,而你的HGETALLLua script将是最慢的。

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


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


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信