设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > MySql教程 > 正文

为什么Zookeeper天生就是一副分布式锁的胚子?(3)

发布时间:2020-03-15 20:08 所属栏目:115 来源:站长网
导读:.connectString(10.231.128.95:2181,10.231.128.96:2181,10.231.128.97:2181) .retryPolicy(policy) .build(); //启动客户端 client.start(); //在zookeeper中定义一把锁 finalInterProcessMutexlock=newInterProce

              .connectString("10.231.128.95:2181,10.231.128.96:2181,10.231.128.97:2181") 

              .retryPolicy(policy) 

              .build(); 

       // 启动客户端 

       client.start(); 

 

       // 在zookeeper中定义一把锁 

       final InterProcessMutex lock = new InterProcessMutex(client, "/mylock"); 

 

       //启动是个线程 

       for (int i = 0; i <10; i++) { 

           new Thread(new Runnable() { 

               @Override 

               public void run() { 

                   try { 

                       // 请求得到的锁 

                       lock.acquire(); 

                       printNumber(); 

                  } catch (Exception e) { 

                       e.printStackTrace(); 

                  } finally { 

                       // 释放锁 

                       try { 

                           lock.release(); 

                      } catch (Exception e) { 

                           e.printStackTrace(); 

                      } 

                  } 

              } 

          }).start(); 

      } 

 

  } 

基于数据的分布式锁

我们在讨论使用分布式锁的时候往往首先排除掉基于数据库的方案,本能的会觉得这个方案不够“高级”。

从性能的角度考虑,基于数据库的方案性能确实不够优异,整体性能对比:缓存>Zookeeper、etcd>数据库。

也有人提出基于数据库的方案问题很多,不太可靠。数据库的方案可能并不适合于频繁写入的操作。

下面我们来了解一下基于数据库(MySQL)的方案,一般分为三类:

基于表记录

乐观锁

悲观锁

基于表记录

要实现分布式锁,最简单的方式可能就是直接创建一张锁表,然后通过操作该表中的数据来实现了。

当我们想要获得锁的时候,就可以在该表中增加一条记录,想要释放锁的时候就删除这条记录。

为了更好的演示,我们先创建一张数据库表,参考如下:

CREATE TABLE `database_lock` ( 

`id` BIGINT NOT NULL AUTO_INCREMENT, 

`resource` int NOT NULL COMMENT '锁定的资源', 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读