在更新和获取键/值时,我正在使用 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?我的班级在 Get<>、GetAll<>、ExpireAt、SetAll<> 等每个操作中都使用 AcquireLock。
但这种方法并非每次都有效。例如,如果锁中的操作抛出异常,则密钥保持锁定状态。对于这种情况,我在 AcquireLock 方法中添加了 DefaultLockExpire 参数以使“锁定”密钥过期。
有没有更好的解决方案,或者我们什么时候需要在多线程编程中获取像“锁”块这样的锁。