我想从Redis的多个哈希中搜索具有最高价值的密钥。我的密钥是这种格式-
emp:1, emp:2,...emp:n
每个具有这种格式的值-
1. name ABC
2. salary 1234
3. age 23
我想从这些哈希中找到最老的员工。根据我对Redis的了解,无法在一个调用中读取多个哈希。这意味着我需要遍历所有emp键,并在每个emp键上调用HGETALL
以获得所需的结果(我确实有一个存储所有emp id的集合)。
有没有一种方法可以最大限度地减少点击次数以使其正常工作?
答案 0 :(得分:2)
您可以在Redis中使用管道来运行多个命令并获取它们的响应。那应该允许您执行多个HGETALL
命令。有关更多信息,请参见docs。不确定要为C#使用哪个库,但是它应该为您提供使用管道的方法。
您还可以创建一个Lua脚本来遍历Redis键并返回最老员工的哈希值。
答案 1 :(得分:0)
是的,对的
... 无法一次读取多个散列 ...
... 您还可以创建一个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(...
将获得亚军,而您的HGETALL
或Lua script
将是最慢的。
如果员工的年龄在不断变化(例如,在线游戏的玩家得分 )并且您经常要查询排行榜或排行榜(例如,更新排行榜),请使用此方法。使用此方法代替数据库的缺点是高冗余。当(例如)员工的地址发生更改时,您需要更改很多记录,并要做很多电话。
[1]如评论中所述,Redis不仅仅是缓存常用数据的缓存。我相信对于这个讨论,这个定义就足够了。