【问题标题】:Block access to Redis key (ServiceStack)阻止对 Redis 密钥 (ServiceStack) 的访问
【发布时间】:2013-01-01 12:09:58
【问题描述】:

我正在尝试使用 ServiceStack Redis 客户端实现我认为非常常见的缓存场景,但我很难找到一个很好的例子。

在 ASP.NET MVC 应用程序中,我们对外部 Web 服务进行相对长时间运行(和计量)的调用,并将结果缓存一段时间。在缓存实现中,希望在 Web 服务调用完成之前阻止对该键的额外请求,以避免额外(昂贵的)调用。

那么,实现键级锁的最佳方式是什么? Redis 是否支持开箱即用? ServiceStack 的IRedisClient.AcquireLock 是否适合这种情况,或者如果我们不处理分布式锁,它是否有点矫枉过正?或者我最好自己实现锁,就像here 描述的那样?

提前致谢!

【问题讨论】:

    标签: asp.net-mvc redis servicestack


    【解决方案1】:

    Redis 是一个非阻塞异步服务器,在 key 空闲之前,redis 没有内置语义来阻塞客户端连接。

    注意:Redis 是一个远程 NoSQL 数据存储,因此您实施的任何涉及 redis 的锁都是设计为“分布式”的。 ServiceStack 的 AcquireLock 使用 redis 的原始 SETNX 锁定语义来确保只有 1 个客户端连接具有锁,所有其他客户端/连接保持阻塞状态,直到通过使用指数重试回退乘数轮询释放锁为止.

    为了在没有轮询的情况下实现分布式锁,您需要创建一个使用 SETNX + redis 的 Pub/Sub 支持组合的解决方案,以通知等待的客户端锁已被释放。

    【解决方案2】:

    我使用以下模式将 Redis 用作全局网络互斥锁:

    1. LPUSH 创建互斥锁
    2. BRPOP 锁定(这是阻止)
    3. LPUSH 解锁

    【讨论】:

      【解决方案3】:

      为什么不对要锁定的键发出 SETNX?如果可以设置/锁定密钥,这将返回 1。如果它已经存在,则为 0,因此无法获取锁。有关具体信息,请参阅http://www.redis.io/commands/setnx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 2017-12-22
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多