网站推广自己可以做吗,做h5小程序的网站,html5设计,石家庄seo关键词排名目录
可重入锁#xff1a; 锁重试和看门狗机制#xff1a;
主从一致性#xff1a; 首先引入依赖#xff0c;配置好信息 3.使用Redisson的分布式锁 可重入锁#xff1a;
可重入锁实现是通过redsi中的hash实现的#xff0c;key依旧是业务名称加id#xff0c;然后第一个…目录
可重入锁 锁重试和看门狗机制
主从一致性 首先引入依赖配置好信息 3.使用Redisson的分布式锁 可重入锁
可重入锁实现是通过redsi中的hash实现的key依旧是业务名称加id然后第一个field存储线程唯一标识value存储上锁的计数同一个线程获取多次锁通过对锁的计数来实现释放通过-1来实现当锁的数为零且锁是当前线程的锁的时候才可以释放锁 获取锁的lua脚本如下
1.首先通关exists去判断这个key是否有锁
2.如果没有锁则直接获取锁通过hset命令创建所通过expire设置过期时间。
3.如果锁存在则根据field中存储的线程标识判断是否是当前线程的锁
3.1 如果是自己的则获得锁通过hincrby将锁的重入次数加1并设置有效期
3.2 如果锁不是自己的则获取失败 释放锁的lua脚本如下
1.首先判断锁是否被自己持有根据线程波标识如果不是自己的说明已经被释放
2.如果线程是自己的则判断锁的重入次数是否大于0
2.1 如果大于0说明不能释放则对重入次数-1并重置有效期
2.2 如果等于0则释放锁 锁重试和看门狗机制 获取锁
1.首先线程进入之后会尝试获取锁
1.1如果获取成功且没有设置过期时间则会自动设置一个看门狗锁有效期为30s看门狗会每隔10s去检查线程是否执行完成如果没有执行完成则继续续10s时长
1.2如果获取锁失败则进入自旋去不断尝试获取锁这中间有个判断剩余时间如果超时则返回false如果没超时且拿到了释放锁的信号则去尝试获取锁
释放锁
1.线程首先尝试去释放锁如果释放锁成功则发送释放锁的消息并取消看门狗
2.如果失败则记录异常并返回 总结
可重入redisson不同于redsi的setnx,他利用hash结构记录线程id和重入次数。
可重试利用信号量获取锁失败的会在等待时间内不断重复去获取锁
超时续约利用看门狗机制默认30s,每隔10s去判断锁是否释放如果没释放则续期重置时间释放则取消看门狗。
那么到这里我们已经解决了三个问题现在还有主从一致性问题没有解决
主从一致性
redis的主从模式是指有一个主节点和多个从节点主节点负责写操作从节点负责读操作
主从同步是有一定延迟性的所以这里需要确保主从的同步
这里就可以设置多个独立节点来实现redisson封装了一个getMutiLock方法他会尝试去获取每一个节点上的锁只有都获取成功才会真正拿到锁 获取锁之后使用方法和以前是一样的。
这样可以确保多节点的一致性但是缺点就是运维成本较高实现复杂