ofeqx.com 方程式科技共享平台 外文资料好找好用。大数据有序化,
专业垂直领域体系的知识共享盘平台,发表您的创作与我们共产知识。
mysql zk redis
msql 加锁就是新增数据 解锁就是删除数据
redis 分布式锁
什么环境使用分布式锁
jdk 中的锁只能解决一个进程多线程的锁 jvm锁
思路
应用
场景
有缺点
redis 单进程 单线程
分布式锁 用在
1多进程
2进行同一个数据读写信息
3 操作数据互斥
加锁
通过setnx 向特定的key写入一个随机值,并同时是设置失效时间,写值成功既加锁成功
注意点
必须给锁设置一个失效时间 避免死锁(防止长时间不响应)
加锁时,每个节点产生一个随机字符串 避免锁误删除 (进行匹配防止解锁其他的锁)
写入随机值与设置失效必须同时的 保证加锁时原子的
解锁
匹配随机值 删除redis 的key 获取数据 判断 删除 原子一致性
这个脚本可以通过 EVAL …script… 1 resource-name token-value 命令来调用。
用脚本保证唯一性
异常处理
失效时间是程序的2倍时间
加锁使用 set
解锁 使用脚本
key 直接为 value 是用threadlocal 将随机值赋值到 local 里面
zookeeper
数据节点:持久节点 持久顺序节点 临时节点 临时顺序节点
zk 分布式锁
mysql 增加删除数据 或者版本号确保
redis setnx set 或者 脚本 确保
zk 节点确保