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不仅仅是常用数据的缓存。我相信对于这个讨论,这个定义是足够的。