分布式锁
单体架构之中,可以使用synchronized或者lock来实现数据同步的问题,但是在分布式应用下,是跨越jvm层面的,不能够使用api层面进行解决
分布式架构之下使用分布式锁可以解决数据同步问题。
分布式锁可以使用三种方式进行解决:
1.redis
redis是使用setnx命令来实现,setnx命令是对不存在redis中的key进行设置值,若操作成功,获取到锁资源,进行业务操作,反之,操作失败,就不能够获取到锁资源。等到获取到锁的线程业务处理完毕之后,删除redis之中的key,即代表释放所资源。但是若在释放锁过程之中,服务器出现宕机,分布式所没有得到及时释放,其他请求将无法正常被处理。所以采用对setnx命令设置的key增加过期时间,等到一段时间过期之后,自动删除key,即代表锁的释放。这样就可以避免因为因为某台服务器宕机而导致锁资源没有及时释放的问题
2.zookeeper
zookeeper是一个属性目录服务,不仅仅可以配合dubbo使用作为注册中心,zookeeper中按照两种维度(临时,顺序)分为四种节点:临时节点,永久性节点,以及带有顺序的节点,不带顺序的节点。
多条线程访问服务器,每一个线程都会向zookeeper中存储一个临时顺序节点,序号最小的节点获取到锁资源,进行业务处理,等到处理完毕之后,与redis的连接释放,临时节点被删除。紧接着次小节点获取到所资源。
多个线程获取到锁资源涉及监听器,即序号第二小的节点监听序号第一小的节点状态,序号第三小的节点监听序号第二小的节点,以此类推。只要被监听节点删除,次小节点就可以获得锁资源,进行业务操作。这个牵扯到公平锁。
3.mysql
mysql利用innodb的行级锁来实现分布式锁
m