C# 如何锁定现有密钥?

C# 如何锁定现有密钥?,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在编写一些c#代码来写入redis服务器。代码是多线程的,所以每当我想对某个key:value对进行更改时,我都需要锁定“key” 我正在使用StackExchange.Redis库。在此库中,接口IDatabase代表redis db,并提供从redis读取/写入的方法。它有2个与锁相关的方法:bool LockTake(RedisKey key,RedisValue value,TimeSpan expiration,CommandFlags flags=CommandFlags.Non

我正在编写一些c#代码来写入redis服务器。代码是多线程的,所以每当我想对某个key:value对进行更改时,我都需要锁定“key”

我正在使用StackExchange.Redis库。在此库中,接口IDatabase代表redis db,并提供从redis读取/写入的方法。它有2个与锁相关的方法:bool LockTake(RedisKey key,RedisValue value,TimeSpan expiration,CommandFlags flags=CommandFlags.None);&布尔锁释放(RedisKey键,RedisValue值,CommandFlags flags=CommandFlags.None)

但是,根据本文,LockTake()只能锁定不存在的密钥:


但我想锁定一个密钥,即使它已经创建,因为多个线程可能会尝试同时更新它。如何在c#中做到这一点?

将更改放在锁(对象){}块中。请记住,Redis库的LockTake命令仅对不存在的密钥有效的原因是它避免了线程a尝试将密钥“Z”的值设置为1,线程B尝试将密钥“Z”的值设置为2的争用条件。如果发生了这种情况,并且看起来这就是您编写代码的目的,那么您将必须确定哪个线程应该“获胜”。将您的更改放在锁(对象){}块中。请记住,Redis库的LockTake命令仅对不存在的密钥有效的原因是它避免了线程a尝试将密钥“Z”的值设置为1,线程B尝试将密钥“Z”的值设置为2的争用条件。如果发生这种情况,并且看起来这就是您编写代码的目的,那么您将必须确定哪个线程应该“获胜”。