我正在尝试使用ServiceStackRedis客户端实现我认为是非常常见的缓存方案,但是我很难找到一个很好的例子。
在ASP.NETMVC应用程序中,我们对外部Web服务进行了相对长时间的运行(按计量),并将结果缓存了一段时间。在高速缓存实现中,希望阻止对该键的其他请求,直到Web服务调用完成为止,以避免其他(昂贵)调用。
那么,实现键级锁定的最佳方法是什么?Redis开箱即用吗?ServiceStack的IRedisClient.AcquireLock是否适合于此,或者如果我们不处理分布式锁,那是否会过大?还是我最好自己自己实施锁,就像这里描述的那样?
提前致谢!
Redis是一个非阻塞异步服务器,在释放 密钥 之前,没有内置的语义可让Redis在客户端连接上进行阻塞。
注意:Redis是一个远程NoSQL数据存储,因此,您实现的涉及Redis的所有锁都将按设计“分布”。ServiceStack的AcquireLock使用redis的原始SETNX 锁定语义来确保只有1个客户端连接具有该锁定,所有其他客户端/连接都将保持阻塞状态,直到使用指数重试退避倍数进行轮询来释放该锁定为止。
为了在不轮询的情况下实现分布式锁,您需要创建一个解决方案,该解决方案结合使用SETNX + redis的发布/订阅支持来通知等待的客户端该锁已被释放。