开发面试题 视频剪辑软件 GraphQL tws mirror jetbrains mysql 多线程 vue docker安装部署 程序栈 tfs datatable msbuild vue案例 vue开发教程 郑州普通话考试 传智播客python jq点击事件 mysql操作日志 linux自动获取ip linux关闭mysql python中的index python正则表达式例子 python条件判断 javaobject java介绍 java获取ip地址 java文件复制 java的多线程 java游戏开发 sql综合利用工具 maxtoc4d emit java游戏编程 服务器系统安装 fireworks8序列号 flash基础 批处理if java字符串截取 苍灵世界
当前位置: 首页 > 学习教程  > 编程语言

简述分布式锁的3种实现方式

2020/11/24 10:49:06 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

分布式锁 作为分布式锁,我觉得至少得:1. 资源唯一且能异步多线程访问; 2. 能改变状态(加锁 / 开锁); 【数据库】你可以设置字段唯一,可以创建 state 字段; 【redis】 的key唯一…

分布式锁

作为分布式锁,我觉得至少得:1. 资源唯一且能异步多线程访问;   2. 能改变状态(加锁 / 开锁);

【数据库】你可以设置字段唯一,可以创建 state 字段;

【redis】 的key唯一,能设置value状态;

【zookeeper】文件名唯一,状态通过创建文件,删除文件来表示状态;

分布式锁存在的问题:

1. 因为是分布式大系统,若分布式锁挂了影响甚大;

2. 是锁就得考虑死锁;redis设置过期时间,数据库感觉可以考虑定时开锁,zookeeper貌似也可以设置定时任务开锁;

 

数据库实现

DROP TABLE IF EXISTS `method_lock`;
CREATE TABLE `method_lock` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `method_name` varchar(64) NOT NULL COMMENT '锁定的方法名',
  `state` tinyint NOT NULL COMMENT '1:未分配;2:已分配',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `version` int NOT NULL COMMENT '版本号',
  `PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_method_name` (`method_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='锁定中的方法';

先获取锁的信息
     select id, method_name, state,version from method_lock where state=1 and method_name='methodName';

占有锁
       update t_resoure set state=2, version=2, update_time=now() where method_name='methodName' and state=1 and version=2;

如果没有更新影响到一行数据,则说明这个资源已经被别人占位了。

 

redis实现

SETNX key val 设置锁

expire key timeout;设置锁过期时间;

delete key;删除释放锁;

 

zookeeper实现

 

为啥用zookeeper ? zookeeper有啥这方面的特点?

ZooKeeper内部是一个分层的文件系统目录树结构,并且规定同一个目录下只能有一个唯一文件名,同名文件多次创建会在文件名称后补数字区分;

故而,若创建了Lock文件,再次创建生成 Lock1 文件,再次创建生成 Lock2 文件,再再次创建生成 Lock3 文件;

那么上图的过程就是:

  1. 创建一个文件夹叫“资源”,然后 client1 需要占用资源,就创建一个 Lock1 文件,发现没有比自己的 Lock1 文件数字更小的,那么 client1 就获取资源使用权;
  2. 然后 client2 也需要占用资源,那么也创建一个Lock文件(最终生成的文件叫 Lock2 ),发现自己前面还有个比自己文件数字更小的 Lock1 ,自己文件数字不是最小的,那么就监听 Lock1, 等待其释放资源;
  3. client 3也来了,也需要占用资源,那么也创建一个Lock文件(最终生成的文件叫 Lock3 ),发现有个 Lock2 , 同理,其监听等待 Lock2 ;

设置锁----》生成锁文件

释放锁----》删除锁文件

 

 

 


本文链接: http://www.dtmao.cc/news_show_400352.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?