次のようにキー/値を更新および取得するときに、ServiceStackRedisの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パラメーターを追加しました。
より良い解決策はありますか、またはマルチスレッドプログラミングで「ロック」ブロックのようなロックを取得する必要があるのはいつですか。