社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Redis

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

Expert • 5 年前 • 829 次点击  

我想从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
 
829 次点击  
文章 [ 2 ]  |  最新文章 5 年前
inquisitive
Reply   •   1 楼
inquisitive    6 年前

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    6 年前

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

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