2013-01-17 74 views
2

我想实现什么,我会觉得是使用ServiceStack Redis的客户一种很常见的缓存方案,但我很难找到一个很好的例子。阻止访问Redis的密钥(ServiceStack)

在ASP.NET MVC应用程序,我们做一个比较长时间运行(与计量)调用外部Web服务和缓存的一段时间内的结果。在缓存实现中,希望阻止对该密钥的附加请求,直到Web服务调用完成,以避免额外的(昂贵的)调用。

那么,什么是实现一键级锁的最好方法? Redis是否支持开箱即用?将ServiceStack的IRedisClient.AcquireLock是一个非常适合这种,或者是矫枉过正,如果我们不处理分布式锁吗?或者,我最好是自己实施锁定,如描述here

在此先感谢!

回答

2

Redis是一个非阻塞的异步服务器,在客户端连接上没有内置的redis语句来阻塞,直到是空闲的。

注:Redis是一个远程NoSQL数据存储库,因此任何锁定您实现涉及Redis的是通过设计“分发”。 ServiceStack的AcquireLock使用Redis的的原始SETNX锁定机制,以确保只有1客户端连接的锁,所有其他客户端/连接保持阻塞,直到锁已被使用指数重试后关闭乘数轮询释放。

为了实现分布式锁不轮询你需要创建一个使用的SETNX + Redis的的发布/订阅的支持相结合,以通知等待客户端的锁已经被释放的解决方案。

+0

Futher信息:https://engineering.gosquared.com/distr 。地理锁 - 使用 - Redis的 – Athlan

+0

甚至更​​多的信息在:http://redis.io/topics/distlock –

0

为什么不出具要锁定键SETNX?如果钥匙可以设置/锁定,这将返回1。如果它已经存在,则为0,因此不能进行锁定。有关具体信息,请参见http://www.redis.io/commands/setnx

2

我使用下面的模式用于使用Redis的作为全球网络互斥:

  1. LPUSH创建一个互斥
  2. BRPOP锁定(这被阻塞)
  3. LPUSH解锁