【问题标题】:stackexchange redis cache performancestackexchange redis 缓存性能
【发布时间】:2017-08-01 13:31:18
【问题描述】:

我必须使用 stackexhange.redis C# 在 redis 缓存中频繁添加 N 个(独立)项目,每个项目都有不同的到期时间,以便客户端的时间最短,服务器端的阻塞和成本最低。 Redis 服务器每秒会收到数百个获取请求,所以我根本不想弄乱获取时间。

我已阅读文档here 并回答here。我找不到执行此操作的单一方法。考虑不同的选择:

  1. 使用事务- 这将阻止服务器端的任何操作。所以这不应该是正确的解决方案
  2. 使用批处理 - 这将阻止客户端的任何操作,直到所有批处理操作完成。这不应该是正确的解决方案。
  3. 使用流水线 - 这不会阻止客户端和服务器端的任何操作。但它可以发送多个请求(小于 N 的数据包)可能会消耗更多的网络,但可能会增加客户端的内存消耗,从而可能导致延迟。
  4. 使用即发即弃 - 这也不会阻止客户端和服务器端的任何操作。但它会发送多个请求(比流水线更多的数据包),这可能会消耗更多的网络带宽,但不会消耗客户端的内存。

哪个应该是最好的方法? 我假设竞争操作意味着 2 个插入和一个 get 和 insert 不能同时进行,尽管它们可能正在访问不同的键。我在这方面是否正确,否则是什么意思?

【问题讨论】:

    标签: c# performance redis stackexchange.redis


    【解决方案1】:

    Redis 在读取或写入数据库时​​是单线程的。

    在您的情况下,最好的解决方案是什么?谁知道呢,它可能取决于很多变量,每个用例都应该单独分析以实施正确的解决方案。

    Redis MULTI 无法避免,除非您想在应用层出现问题时破坏数据。实际上,如果你想避免对 Redis 的很多请求,你应该改用Lua scripts

    另一方面,Redis 的重点是尝试进行许多操作,但由于 Redis 单线程的特性,请确保这些操作尽可能小。没错,它的速度非常快,除非您执行的操作需要花费太多时间。

    总而言之,我不会太在意发送许多请求,因为它是一个内存数据库并以光速工作。此外,请考虑 Redis Cluster(即 分片)的奇迹,以便能够优化您的场景。

    最后,我想看看这个 Redis 教程:Redis latency problems troubleshooting

    【讨论】:

      【解决方案2】:

      您应该将 Lua 脚本添加到您的选项列表中。见EVAL

      另外,请考虑您将使用的数据结构。例如,您可以使用 MSET 在 Redis 中一跳发送多个值。

      【讨论】:

        猜你喜欢
        • 2019-04-05
        • 2022-01-12
        • 1970-01-01
        • 2013-01-28
        • 2015-06-02
        • 2020-02-15
        • 2017-05-06
        • 2018-03-22
        • 2022-06-17
        相关资源
        最近更新 更多