.NET 使用redis的分布式锁代码
时间: 2023-10-10 12:16:00 浏览: 46
使用 Redis 实现分布式锁的代码示例可以如下所示```csharp
using StackExchange.Redis;
using System;
public class RedisDistributedLock
{
private readonly ConnectionMultiplexer _redis;
private readonly IDatabase _database;
public RedisDistributedLock(string connectionString)
{
_redis = ConnectionMultiplexer.Connect(connectionString);
_database = _redis.GetDatabase();
}
public bool AcquireLock(string lockKey, TimeSpan expiryTime, out string lockValue)
{
lockValue = Guid.NewGuid().ToString();
return _database.StringSet(lockKey, lockValue, expiryTime, When.NotExists);
}
public bool ReleaseLock(string lockKey, string lockValue)
{
return _database.ScriptEvaluate(
LuaScript.Prepare(
"if redis.call('get', KEYS[1]) == ARGV[1] then " +
" return redis.call('del', KEYS[1]) " +
"else " +
" return 0 " +
"end"),
new RedisKey[] { lockKey },
new RedisValue[] { lockValue }
).Equals(1L);
}
}
```
在上面的代码中,我们使用 StackExchange.Redis 库来连接 Redis 数据库。`AcquireLock` 方法用于获取分布式锁,`ReleaseLock` 方法用于释放分布式锁。
使用示例:
```csharp
using System;
public class Program
{
public static void Main()
{
var connectionString = "your_redis_connection_string";
var lockKey = "my_lock_key";
var expiryTime = TimeSpan.FromSeconds(30);
using (var redisDistributedLock = new RedisDistributedLock(connectionString))
{
string lockValue;
if (redisDistributedLock.AcquireLock(lockKey, expiryTime, out lockValue))
{
try
{
// 执行需要加锁的逻辑
Console.WriteLine("Lock acquired. Performing critical section...");
// 在这里执行需要加锁的操作
// 模拟操作耗时
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
Console.WriteLine("Critical section completed.");
}
finally
{
redisDistributedLock.ReleaseLock(lockKey, lockValue);
}
}
else
{
Console.WriteLine("Failed to acquire lock.");
}
}
}
}
```
上述代码中,我们使用一个唯一的 `lockValue` 来标识锁的持有者。在 `AcquireLock` 方法中,我们使用 Redis 的 `StringSet` 方法来尝试将锁的键值对写入 Redis,并设置过期时间和条件 `When.NotExists`(只有当键不存在时才设置成功)。在 `ReleaseLock` 方法中,我们使用 Lua 脚本来判断当前锁是否属于当前持有者,并通过 `ScriptEvaluate` 方法执行脚本。
请注意,这只是一个简单的示例代码,实际应用中可能需要处理更多的情况,比如锁的续期、异常处理等。