IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 使用数据库实现分布式锁 -> 正文阅读

[大数据]使用数据库实现分布式锁

问题:当服务部署到了集群中,我们对共享资源加锁使用synchronized/Lock已经无能为力了,所以需要引入分布式锁。?

针对分布式锁的实现常见的有3种实现:

1.基于数据库,如Mysql、Oracle

2.基于缓存,如redis

3.基于zookeeper

我们本篇讨论的是基于数据库实现。

使用数据库实现分布式锁需要建一张lock表,表中设置一个unique索引,获取锁时,尝试给表中insert记录,若失败,则说明锁被别的线程抢占了,还未释放。当处理完业务,释放锁,删除表中的那条记录即可。?

step1:建表

CREATE TABLE `my_lock` (
  `id` varchar(32) NOT NULL,
  `resource` varchar(45) NOT NULL,
  `createTime` bigint(13) DEFAULT NULL,
  PRIMARY KEY (`id`,`resource`),
  UNIQUE KEY `resource_UNIQUE` (`resource`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

tips:表名切勿使用lock,使用关键字语法会报错。

Lock实体:

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("my_lock")
public class Lock {
    private String id;
    private String resource;
    private long createTime;
}

service层和repositroy层代码略

step2:模板锁

使用模板模式写一个锁的抽象类,getLock里在获取锁失败后,会wait一段时间,然后递归地再去获取锁,直到获取到锁为止。

AbstractLock.java

public abstract class AbstractLock {
    /**
     * 加锁
     * @param lockResource lockResource
     */
    public void getLock(String lockResource){
        if(tryLock(lockResource)){
            System.out.println("获得了锁");
        }else{
            waitLock();
            getLock(lockResource);
        }
    }

    /**
     * 尝试获得锁
     * @return boolean
     */
    public abstract boolean tryLock(String lockResource);

    /**
     * 等待锁
     */
    public abstract void waitLock();

    /**
     * 释放锁
     */
    public abstract void unLock(String lockResource);
}

step3:锁的实现

MySqlLock.java

@Service
public class MysqlLock extends AbstractLock {
    @Autowired
    private ILockService iLockService;
    @Override
    public boolean tryLock(String lockResource) {
        boolean flag = true;
        try {
            Lock lock = new Lock();
            lock.setId(IdUtil.simpleUUID());
            lock.setResource(lockResource);
            lock.setCreateTime(System.currentTimeMillis());
            iLockService.insert(lock);
        }catch (Exception e){
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    @Override
    public void waitLock() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void unLock(String lockResource) {
        iLockService.deleteByUniqueKey(lockResource);
    }

}

step4:锁的使用

    @Autowired
    private MysqlLock lock;
    @Test
    void testDatabaseLock() {
        try{
            lock.getLock("order");
        }catch (Exception e){

        }finally {
            lock.unLock("order");
        }

    }

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:35:16  更:2021-10-11 17:35:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:41:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码