Redis 加锁与解锁类,引用 using StackExchange.Redis;
/// <summary>
/// redis分布式锁
/// 分布式锁四要素
/// 1、锁名
/// 2、加锁
/// 3、解锁
/// 4、锁超时时间
/// </summary>
class RedisLock
{//转载请保留 http://www.luofenming.com/show.aspx?id=ART2020070100001
// 1、redis连接管理类
private ConnectionMultiplexer connectionMultiplexer = null;
// 2、redis数据操作类
private IDatabase database = null;
public RedisLock()
{
connectionMultiplexer = ConnectionMultiplexer.Connect("localhost:6379");
database = connectionMultiplexer.GetDatabase(0);
}
/// <summary>
/// 加锁
/// 1、成功
/// 2、失败
/// </summary>
public bool Lock()
{
///1、key 锁名
///2、value 锁对象(谁锁的锁)
///3、expire 锁过期时间(防死锁)
// 1、redis加锁
// 如何说加锁失败,怎么办?继续获取嘛
for (int i = 0; i < 10; i++)
{
bool flag = database.LockTake("redis_lock", Thread.CurrentThread.ManagedThreadId, TimeSpan.FromSeconds(10));
if (flag)
{
return flag;
}
// 防止死循环导致内存溢出问题
Thread.Sleep(20);
}
return false;
}
/// <summary>
/// 解锁(释放锁占用资源)
/// </summary>
public bool Unlock()
{
// 1、redis解锁
bool flag = database.LockRelease("redis_lock", Thread.CurrentThread.ManagedThreadId);
// 2、释放redis资源
connectionMultiplexer.Close();
return flag;
}
}
下面是调用加锁与解锁和一些业务操作
/// <summary>
/// 秒杀方法
/// </summary>
public void SkillProduct()
{
RedisLock redisLock = new RedisLock();
if (redisLock.Lock())
{
// 1、获取商品库存
int productCount = 从数据库获取商品个数据
// 2、判断商品库存是否为空
if (productCount == 0)
{
// 2.1 秒杀失败消息
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:不好意思,秒杀已结束");
redisLock.Unlock();
return;
}
// 3、秒杀成功消息
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:恭喜你,秒杀成功,商品编号:从数据库里面查询出来的编号");
// 4、扣减商品库存
productCount--;
redisLock.Unlock();
}
}
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有