分布式概念
因为架构演变,才有了 有一变多,单个变集群的概念。相应的数据存储也从一处变成多处,也就是分布式的存储。 分散能力
相同业务的资源能力分散化,高可用,高利用。 业务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 如果能避免使用分布式还是避免,毕竟有性能的关系,
|