分布式锁 阻塞锁(一)
本文介绍 redis 阻塞锁
使用的 类库 Nuget 查找 ServiceStack.Redis
阻塞锁 主要 考虑的是 锁等待时间的 设置 ,业务初期 时间设置 看似没有问题 但是 上线很久 数据增多 业务量大执行业务时间会增加
那么 会出现 取锁的当前时间 大于 锁的等待时间 抛了异常的情况,这种情况就是 用户没有真实参与到 秒杀活动中或者 争抢活动中去 ,
比如 有5个商品 ,10个人抢,正常 是5个人抢到,但是如果 出现 取锁的当前时间 大于 锁的等待时间 抛异常 很可能就1个抢到库存还剩4个商品 达不到业务需求
上问题 情况测试

但是 我人为为了测试在代码上加了睡眠等待

此时就会出现 好多人不会参与到正常秒杀活动中去

所以核心是设置 业务锁等待时间 让 更多人的参与到 秒杀业务中去
代码如下
/// <summary>
/// 阻塞锁
/// </summary>
public class AcquireLock
{
public static readonly string AcuqirelockKey = "lock";
public static readonly string AcuqireKey = "total";
public static async void TestLock()
{
using (RedisClient redisClient = new RedisClient("192.168.0.168:6379"))
{
try
{
using (redisClient.AcquireLock(AcquireLock.AcuqirelockKey, TimeSpan.FromSeconds(1)))
{
//如果业务操作时间过长那么下一个取锁就会抛异常那么就存在会有好多人不会参与到正常秒杀活动
await Task.Delay(5000);
int total = redisClient.Get<int>(AcquireLock.AcuqireKey);
if (total > 0)
{
total = total - 1;
redisClient.Set<int>(AcquireLock.AcuqireKey, total);
Console.WriteLine($"抢到了,总数为{total}--当前线程为{Thread.CurrentThread.ManagedThreadId}");
}
else
{
Console.WriteLine($"库存没有了{total}---当前线程为{Thread.CurrentThread.ManagedThreadId}");
}
}
}
catch (Exception ex)
{
//如果某个线程在取锁的时候 当前时间大于锁的等待时间 那么就抛异常
Console.WriteLine($"锁过期了{ex.Message} 当前线程为={Thread.CurrentThread.ManagedThreadId}");
}
}
}
}
浙公网安备 33010602011771号