我想实现的东西我认为是使用ServiceStack Redis的客户一种很常见的缓存方案,但我很难找到一个很好的例子。
在ASP.NET MVC应用程序,我们做一个比较长时间运行(与计量)调用外部Web服务和缓存的一段时间内的结果。 在缓存实现,希望阻止该键额外的请求,直到Web服务调用完成,以避免额外的(昂贵的)电话。
那么,什么是实现一键级锁的最好方法? Redis的是否支持这一开箱? 将ServiceStack的IRedisClient.AcquireLock是一个非常适合这种,或者是矫枉过正,如果我们不处理分布式锁吗? 或者,我会是最好的关闭只是实现锁定自己,像描述在这里 ?
提前致谢!
Redis是一个非阻塞异步服务器,没有内置在Redis的一个客户端连接上阻塞,直到关键是免费的语义。
注:Redis是一个远程NoSQL数据存储库,因此任何锁定您实现涉及Redis的是通过设计“分发”。 ServiceStack的AcquireLock使用Redis的的原始SETNX锁定机制,以确保只有1客户端连接的锁,所有其他客户端/连接保持阻塞,直到锁已被使用指数重试后关闭乘数轮询释放。
为了实现分布式锁不轮询你需要创建一个使用SETNX + Redis的的发布/订阅支持的组合来通知等待客户端的锁已经被释放的解决方案。
我用以下方式使用Redis的作为一个全球性的网络互斥:
- LPUSH创建一个互斥体
- BRPOP锁定(这被阻塞)
- LPUSH解锁
为什么不出具要锁定键SETNX? 这将返回1,如果该键可设定/锁定。 和0,如果它已经存在,因此不能采取锁。 见http://www.redis.io/commands/setnx具体信息。