分布式锁 乐观锁(二)
本文介绍了 redis 乐观锁
使用的是 Nuget ServiceStack
乐观锁的核心是用户每次抢购 直接返回结果 用户不用等待 ,如果还想抢购用户再次发起请求抢购

第一次抢

第二次抢

第三次抢 库存就没有了

上代码
/// <summary>
/// 乐观锁
/// </summary>
public class OptimismLock
{
public static readonly string OptimismLockKey = "Optimismlock";
public static readonly string OptimismKey = "OptimismTotal";
public static readonly string Prefix = "lock";
/// <summary>
/// 乐观锁
/// </summary>
public static void OptimismLockTest()
{
using (RedisClient redisClient = new RedisClient("192.168.0.168:6379"))
{
bool result = redisClient.Add<string>(Prefix + OptimismLockKey, OptimismLockKey, TimeSpan.FromSeconds(1));
if (!result)
{
Console.WriteLine($"没有抢到锁---当前线程为{Thread.CurrentThread.ManagedThreadId}");
return;
}
try
{
//这里也会出现业务时间过长 导致多个线程 拿到锁的情况
int total = redisClient.Get<int>(OptimismLock.OptimismKey);
if (total <= 0)
{
Console.WriteLine($"已经抢完你来晚了,当前线程为{Thread.CurrentThread.ManagedThreadId}");
return;
}
total = total - 1;
redisClient.Set(OptimismLock.OptimismKey, total);
Console.WriteLine($"抢到锁总数为{total}--当前线程为{Thread.CurrentThread.ManagedThreadId}");
}
catch (Exception ex)
{
Console.WriteLine($"报错当前线程为{Thread.CurrentThread.ManagedThreadId},{ex.Message}");
}
finally
{
redisClient.Remove(Prefix + OptimismLockKey);
}
}
}
}
浙公网安备 33010602011771号