一次通话即可从Redis读取多个哈希

时间:2018-08-20 15:50:42

标签: c# redis stackexchange.redis

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

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

每个具有这种格式的值-

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以在Redis中使用管道来运行多个命令并获取它们的响应。那应该允许您执行多个HGETALL命令。有关更多信息,请参见docs。不确定要为C#使用哪个库,但是它应该为您提供使用管道的方法。

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

答案 1 :(得分:0)

tldr;

是的,对的

  

... 无法一次读取多个散列 ...

@TheDude

  

... 您还可以创建一个Lua脚本来迭代Redis键 ...

添加到其中

似乎您正在使用Redis作为数据库。您已经存储了所有域数据,现在想查询它。这是对Redis的滥用。可以做到,但这不是要这样做的意思。对于此活动,如果您使用真实的数据库,它将更加容易并且性能更高。

Redis用于缓存常用数据 [注:1] 。请注意两个词:(1)缓存和(2)常用。 缓存是临时存储。如果要永久存储(在服务器重新启动后),请使用数据库。 常用表示不要在其中存储所有数据。仅存储正在使用的子集。您可以将Redis与所有数据一起使用,甚至可以在永久存储处于打开状态的情况下使用,但随后必须非常小心。

出于您的目的,似乎使用通用数据库,SELECT MAX(age) FROM ...会更好,甚至更好。

或者也许,

您只引用了部分实际问题,实际上您 遵循Redis最佳实践。在这种情况下,我建议您使用单独的Sorted Set。对于插入主键集中的每个员工,也要执行ZADD employeeages 80 Alen,其中80是年龄,而Alen是Alen人的ID。

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

ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1

如果这看上去很奇怪,那么您是对的-这很有趣!这样不仅可以在一次调用中获得数据,而且可以在一次调用中的 step 中获得数据!考虑一下:假设您有一百万名员工(waao)。然后,使用数据库的这种方式来获取最老员工将是最快的,SELECT MAX(...将获得亚军,而您的HGETALLLua script将是最慢的。

如果员工的年龄在不断变化(例如,在线游戏的玩家得分 )并且您经常要查询排行榜或排行榜(例如,更新排行榜),请使用此方法。使用此方法代替数据库的缺点是高冗余。当(例如)员工的地址发生更改时,您需要更改很多记录,并要做很多电话。


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