Py学习  »  Redis

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

Expert • 4 年前 • 626 次点击  

我想从redis中的多个哈希中搜索值最高的键。我的钥匙是这种格式的-

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

每个都有这种格式的值-

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

我想找一个最老的员工。根据我读到的关于redis的内容,在一个调用中无法读取多个哈希。这意味着我需要遍历所有EMP键并调用 HGETALL 为了得到所需的结果(我有一个存储所有EMP ID的集合)。

有没有一种方法可以使点击量最小化以使其正常工作?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37883
 
626 次点击  
文章 [ 2 ]  |  最新文章 4 年前
inquisitive
Reply   •   1 楼
inquisitive    5 年前

TLDR;

是的,你是对的

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

所以 @TheDude

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

添加到它

似乎您正在使用redis作为数据库。您已存储了所有域数据,现在要查询它。这是对redis的滥用。这是可以做到的,但这不是它的本意。对于这个活动,如果您使用一个真正的数据库,它将变得更容易和更具性能。

redis用于缓存常用数据 [注:1 ] . 注意两个词(1)缓存和(2)经常使用。 高速缓存 临时存放。如果您希望永久存储-在服务器重新启动后-转到数据库。 常用 说不要把你所有的数据都存储在那里。只存储当前正在使用的子集。你可以在所有的数据中使用redis,即使打开了永久存储,但是你必须非常小心。

出于您的目的,它似乎使用通用数据库和 SELECT MAX(age) FROM ... 如果不是更好的话也一样好。

或者,

你只引用了实际问题的一部分,实际上你 遵循Redis最佳实践。在这种情况下,我建议单独 Sorted Set . 对于插入到主密钥集中的每个员工,也要这样做 ZADD employeeages 80 Alen 哪里 80 是时代和 Alen 可以推定此人的身份。

要获取年龄最大的人的ID,可以

ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1

如果这看起来很奇怪,那么你是对的——这是非常有趣的事情!这样不仅可以在单个呼叫中获取数据,还可以在单个呼叫中获取数据。 在那个电话里!考虑一下:假设你有一百万名员工(waao)。那么,使用数据库和 SELECT MAX(... 将是亚军和你的 HGETALL Lua script 将是最慢的。

如果员工的年龄经常发生变化,如在线游戏玩家的分数,则使用此方法。 你经常想查询排名第一或更松散的人,比如更新排行榜。使用这种方法代替数据库的缺点是高冗余。当(比如)一个雇员的地址改变时,你需要改变很多记录,为此你需要打很多电话。


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

TheDude
Reply   •   2 楼
TheDude    5 年前

您可以使用redis中的管道运行多个命令并获取它们的响应。它应该允许您执行多个 HGETALL 命令。见 docs 更多信息。不确定您正在为C_使用什么库,但它应该为您提供一种使用管道的方法。

您还可以创建一个Lua脚本来迭代redis键,并返回最老员工的散列值。