我正在尝试使用 ServiceStack Redis 客户端来实现我认为非常常见的缓存场景,但我很难找到一个很好的示例。
在 ASP.NET MVC 应用程序中,我们对外部 Web 服务进行相对长时间运行(且按计量)的调用,并将结果缓存一段时间。在缓存实现中,需要阻止对该 key 的其他请求,直到 Web 服务调用完成,以避免额外的(昂贵的)调用。
那么,实现键级锁的最佳方式是什么? Redis 开箱即用吗? ServiceStack 的 IRedisClient.AcquireLock 会吗?非常适合这个,或者如果我们不处理分布式锁,这是否太过分了?或者我最好自己实现锁,就像描述的那样 here ?
提前致谢!
最佳答案
Redis 是一个非阻塞异步服务器,Redis 没有内置语义来阻止客户端连接,直到 key 空闲为止。
注意:Redis 是一个远程 NoSQL 数据存储,因此您实现的涉及 Redis 的任何锁都是按设计“分布式”的。 ServiceStack 的 AcquireLock 使用 Redis 的原始 SETNX 锁定语义来确保只有 1 个客户端连接拥有锁定,所有其他客户端/连接都保持阻塞状态,直到使用指数重试回退乘数进行轮询来释放锁定为止.
为了实现无需轮询的分布式锁,您需要创建一个解决方案,结合使用 SETNX + redis 的 Pub/Sub 支持来通知等待的客户端锁已被释放。
关于asp.net-mvc - 阻止对 Redis key 的访问 (ServiceStack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387802/