分布式锁
1. 什么是分布式锁?
分布式锁:进程锁(可以在查询和更新数据库的时候都加锁)
分布式就是SOA,面向分布式对象的架构
2. 为什么使用分布式锁:数据安全
保持数据一致性的是分布式事务
3.应用分布式的场景:
3.1 redis
3.2 redis客户端,StackExchange Redis
3.3 业务
4.分布式锁4要素
4.1 锁名
4.2 加锁操作
4.3 解锁操作
4.4 锁超时时间
public class RedisLock
{
private ConnectionMultiplexer connectionMultiplexer = null;
private IDataRedis database = null;
public RedisLock()
{
connectionMultiplexer = new ConnectionMultiplexer .Connect("localhost:6379");
dataBase = connectionMultiplexer.GetDatabase(0);
}
///<Summary>
///加锁
///1. key, 锁名
///2. value, 谁加了这把锁-->防止所被其他线程释放掉
///3. 锁的超时时间,防止死锁
///</Summary>
public void Lock()
{
//加锁
//如果加锁失败,继续获取锁,会有无限次失败,所以要用死循环
while(true)
{
bool flag = database.LockTake("秒杀锁", Thread.CurrentThread.ManagedThreadId, TimeSpan.FromSeconds(10));
if(flag)
{
break;
}
//无限死循环可能导致系统宕机,需要休眠一下
Thread.Sleep(200);
}
}
///<Summary>
///解锁
///</Summary>
public void UnLock()
{
//1. 解锁,参数是加锁的时候的锁的名字,和加这个锁的线程Id
dataBase.LockRelease("skill_locks", Thread.CurrentThread.ManagedThreadId);
//2. 关闭一下资源
connectionMultiplexer.Close();
}
}
5.Redis集群中锁失败----》RedLock红锁算法