Redis分布式锁

分布式概念

因为架构演变,才有了 有一变多,单个变集群的概念。相应的数据存储也从一处变成多处,也就是分布式的存储。 分散能力

相同业务的资源能力分散化,高可用,高利用。
业务A 的领域能力 可以 分散成 A1 A2 A3 A4 4台资源分散化,A1有问题 A2 A3 A4都能干活,而且服务的整合能力也是3倍。

锁概念

既然高可用,能力分散在多个服务器,锁是干嘛的,要知道,业务处理的能力在多再强大,对于数据核心处理的地方只有一个那就是 数据库资源,这个是共享的区域,锁就是为了 在高可用的情况下 确保安全。

锁就是锁共享内容
lock 方法 是 共享内存块
Monitor.Enter
Monitor.Exit
其实就是内存中共享头部在 0 1 之间转换来实现 一个 锁的标识

为什么要分布式锁

因为现在业务复杂,架构庞大,多个集群
但是分布式 是多台机器 多个进程 lock只是针对一台自身的资源
所以需要找一个 跨机器的资源 来当锁,通过一个共享文件来标识识别锁的状态。

所以跨机器的数据库资源,redis es mongodb mysql 就满足

如果用数据库得资源当锁得话,会有IO读写性能,所以最好是找内存数据库资源
所以选择redis

这样一来,多个机器发请求到redis 这里,即使多个机器是多线程,但是在redis 这里之后就是单线程去控制

怎么管理这么多分布请求。

1.获取锁
2.设置时间
3.释放

1、SETNX
SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
2、expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
3、delete
delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令

过程其实就是这样
但是注意的是 获取锁 的方式 有阻塞 非阻塞
同时抢的话 抢到依据是在事务中看版本号来成功与否
LUA脚本 原子性操作

设置时间
1.是防止 意外情况 一直不释放锁 造成死锁
2.是怕没执行完业务操作就释放的情况

释放锁
LUA脚本 原子性操作

谁加锁谁解锁

可重入

redisson
如果能避免使用分布式还是避免,毕竟有性能的关系,

你可能感兴趣的:(Redis,redis)