【问题标题】:Reading multiple Hashes from Redis in one call一次调用从 Redis 读取多个哈希
【发布时间】:2018-08-21 10:35:54
【问题描述】:

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

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

每个都有这种格式的值 -

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

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

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

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

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

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

    【讨论】:

    • 另一种方法实际上是将感兴趣的键名存储在另一个数据结构中 - 例如一个排序集 - 允许根据用例的要求进行查询(并随后读取它们)。
    【解决方案2】:

    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 中获取!考虑一下:假设您有 100 万员工 (waao)。那么这种获取最年长员工的方法将是最快的,使用数据库和SELECT MAX(... 将获得亚军,而您的HGETALLLua script 将是最慢的。

    如果您的员工的年龄经常变化 - 例如在线游戏的玩家分数并且您经常想要查询排名靠前或较松的 - 例如更新排行榜,请使用此方法。使用这种方法代替数据库的缺点是高冗余。当(比如说)员工的地址发生变化时,您需要更改大量记录,为此您需要拨打很多电话。


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

    【讨论】:

    • 非常感谢您的回答:)
    • 不错的答案,但完全不同意“Redis 用于缓存常用数据”的定义。 v1.0 可能确实如此,但从那时起 Redis 已经取得了长足的进步。
    • @ItamarHaber 感谢您的指出:我打算放一个脚注但忘记了。现已更新!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2012-07-02
    • 2017-04-24
    • 2013-06-20
    相关资源
    最近更新 更多