问: 不是有redission等现成工具吗?咋不用? 答: 不,我就想自己写一个! 陈建斌说 : 你这个男的怎么回事 ?!
有的同学,就是这么尿性。也能理解,不自己弄一下,怎么能理解透彻,那就一起来搞一下呗!
使用场景和选型
分布式多节点的部署方式,使得共享变量有可能被同时操作,遇到有数据一致性要求的情况,就需要采取全局锁定的措施来保障并发操作下的一致性要求,如,库存扣减操作、同一个商品的上下架和更新操作等等。
常见的,分布式锁采用Zookeeper
和Redis
来实现。怎么取舍呢?
zookeeper | redis | |
---|---|---|
加锁原理 | 创建节点,节点已存在时创建失败 | 插入数据,数据已存在则设置失败 |
过期保护 | 节点类型为临时节点,断连删除 | 设置过期时间,到期删除 |
优点 | 在加锁失败时,zk的注册通知更优雅 | 速度快,性能高 |
缺点 | 只有leader负责写,然后通知flower,性能较差 | 抢锁失败时,需要自旋循环尝试 |
生产环境下,性能往往被优先考虑,相比较各自的优缺点,综合考虑,我们一般更倾向于redis。
从0到1 实现分布式锁
step1: 加锁 和 解锁的基础能力构建
Jedis.set(key, value, params)