更新和获取像这样的键/值时,我正在使用ServiceStack Redis的AcquireLock方法:public virtual void Set(string key, T entity){ using (var client = ClientManager.GetClient()) { using (client.AcquireLock(key + ":locked", DefaultLockingTimeout, DefaultLockExpire)) { client.Set(key, entity); } }}我已经扩展了AcqurieLock方法以接受额外的参数,以使锁定键到期。所以我想知道是否根本不需要AcquireLock?我的类(class)在每个操作(例如Get ,GetAll ,ExpireAt,SetAll 等)中都使用AcquireLock。但是这种方法并非每次都能奏效。例如,如果锁中的操作引发异常,则该键保持锁定状态。对于这种情况,我向AcquireLock方法添加了DefaultLockExpire参数,以使“锁定”键失效。有没有更好的解决方案,或者什么时候需要在多线程编程中获取诸如“lock”块之类的锁? 最佳答案 正如《真实法案》的答案所说,您不需要Redis本身的锁。 ServiceStack客户端在锁定方面提供的功能不是针对Redis,而是针对您的应用程序。在C#应用程序中,您可以使用lock(obj)在本地锁定事物,这样就不会同时发生某些事情(一次只能有一个线程可以访问锁定的部分),但是只有在拥有一个Web服务器的情况下才能起作用。如果要防止同时发生某些事情,则需要一种位于Web服务器外部的锁定机制。 Redis非常适合此操作。我们有这样一种情况:检查客户是否已经有购物车,如果没有,请创建它。在检查和创建购物车之间,有时还会有另一个请求发现购物车不存在,也可能会继续创建购物车。这是锁定的经典情况,但是简单的lock在这里不起作用,因为请求可能来自完全不同的Web服务器。因此,为此,我们使用 ServiceStack Redis客户端(具有某种抽象性)来使用Redis进行锁定,并且一次只允许一个请求进入“创建购物车”部分。因此,要回答您的实际问题:不,您不需要锁即可获取/设置Redis值。关于locking - 更新Redis键/值时获取锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14982260/
10-16 22:03