各种分布式锁的实现以及redis和zookeeper分布式锁对比

2019-05-17  本文已影响0人  挡不住的柳Willow

注:根据本人理解,一切分布式协调相关的实现,都需要引入一个第三者,如分布式注册中心需要依赖zookeeper、eureka,分布式缓存需要依赖redis、memcache等
关于分布式锁的概念和应用场景本文不作解释,下面会简述三种分布式锁的实现方式
以下所有实现方式的demo git地址

jdk的实现方式

思路:另启一个服务,利用jdk并发工具来控制唯一资源,如在服务中维护一个concurrentHashMap,其他服务对某个key请求锁时,通过该服务暴露的端口,以网络通信的方式发送消息,服务端解析这个消息,将concurrentHashMap中的key对应值设为true,分布式锁请求成功,demo中写了一个基于netty通信的分布式锁,当然你想用java的bio、nio或者整合dubbo、spring cloud feign来实现通信也没问题
缺点:demo中的锁写的非常简单,但是要考虑可用性、可靠性、效率、扩展性的话,编码难度会比较高

redis的实现方式

原理:利用redis的setnx的特性,能够保证同一时间内只有一个请求能够对相同的key执行setnx指令,我们可以理解为只有一个请求能够抢到这个锁,由于redis是单线程的,可以非常简单地实现这个功能。但是这里的锁的概念与我们平时锁理解的有一点区别,如mysql中的互斥锁,行数据被锁定以后,其他任何线程都无法对其进行删改操作,但是redis里只保证setnx的操作有这个特性,其他请求依然可以在key被锁住的情况下,执行del和set等操作,下面是redis分布式锁的各种实现方式和缺点,按照时间的发展排序:

基于zookeeper实现的分布式锁

总结

没有绝对完美的实现方式,具体要选择哪一种分布式锁,需要结合每一种锁的优缺点和业务特点而定

redis分布式锁最佳事件

直接用redisson实现的分布式锁,兼容单机、哨兵、集群,利用hash + redis订阅监听实现重入锁和锁的等待。利用list + zSet实现公平锁

上一篇 下一篇

猜你喜欢

热点阅读