基于数据库与基于ZooKeeper分布式锁的区别

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 分布式锁是在分布式系统中用于实现多个节点之间的互斥访问共享资源的一种锁机制。它可以确保在分布式环境中的并发操作不会导致数据不一致或冲突。

下面是两种常见的分布式锁类型以及它们的底层原理和示例代码:

  1. 基于数据库的分布式锁:
    基于数据库的分布式锁通过数据库的事务机制来实现锁机制。它的基本思想是通过在数据库中插入一条唯一的记录作为锁,其他节点在获取锁时会尝试插入相同的记录,如果插入成功,则表示获取到了锁。
public class DatabaseLock {
    private DataSource dataSource;
    public boolean tryLock(String lockKey) {
        try (Connection connection = dataSource.getConnection()) {
            connection.setAutoCommit(false);
            PreparedStatement statement = connection.prepareStatement("INSERT INTO locks(lock_key) VALUES(?)");
            statement.setString(1, lockKey);
            try {
                statement.executeUpdate();
                connection.commit();
                return true;
            } catch (SQLException e) {
                connection.rollback();
                return false;
            }
        } catch (SQLException e) {
            return false;
        }
    }
    public void unlock(String lockKey) {
        try (Connection connection = dataSource.getConnection()) {
            connection.setAutoCommit(false);
            PreparedStatement statement = connection.prepareStatement("DELETE FROM locks WHERE lock_key = ?");
            statement.setString(1, lockKey);
            try {
                statement.executeUpdate();
                connection.commit();
            } catch (SQLException e) {
                connection.rollback();
            }
        } catch (SQLException e) {
            // 处理异常
        }
    }
}
  1. 基于ZooKeeper的分布式锁:
    基于ZooKeeper的分布式锁利用ZooKeeper的有序节点和监听机制来实现锁机制。每个节点在获取锁时会创建一个有序的临时节点,根据节点的顺序判断是否获取到了锁。如果节点的顺序最小,则表示获取到了锁。
public class ZooKeeperLock {
    private ZooKeeper zooKeeper;
    private String lockPath;
    private String currentPath;
    public boolean tryLock() {
        try {
            currentPath = zooKeeper.create(lockPath + "/lock_", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
            List<String> children = zooKeeper.getChildren(lockPath, false);
            Collections.sort(children);
            String smallestPath = children.get(0);
            if (currentPath.equals(lockPath + "/" + smallestPath)) {
                return true;
            }
            CountDownLatch latch = new CountDownLatch(1);
            String previousPath = children.get(Collections.binarySearch(children, currentPath.substring(lockPath.length() + 1)) - 1);
            zooKeeper.exists(lockPath + "/" + previousPath, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (event.getType() == Event.EventType.NodeDeleted) {
                        latch.countDown();
                    }
                }
            });
            latch.await();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    public void unlock() {
        try {
            zooKeeper.delete(currentPath, -1);
        } catch (Exception e) {
            // 处理异常
        }
    }
}

这两种分布式锁类型都有各自的优劣和适用场景。基于数据库的分布式锁简单易实现,但在高并发场景下性能可能不如基于ZooKeeper的分布式锁;而基于ZooKeeper的分布式锁具有高性能和强一致性的特点,但对ZooKeeper的依赖性较高。

总结起来,分布式锁是用于在分布式系统中实现互斥访问共享资源的一种锁机制。不同的分布式锁类型有不同的底层原理,可以根据实际需求选择合适的分布式锁实现。

目录
相关文章
|
3月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
1月前
|
存储 SQL 运维
速看!数据库与数据仓库的本质区别是什么?
本文深入解析了“数据库”与“数据仓库”的核心区别,涵盖设计目的、数据结构、使用场景、性能优化和数据更新五个维度。数据库主要用于支持实时业务操作,强调事务处理效率;数据仓库则面向企业分析决策,注重海量数据的整合与查询性能。二者在企业中各司其职,缺一不可。
|
7月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
3月前
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
202 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库中的 char 与 varchar的区别是什么
MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
260 0
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
6月前
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
228 12
|
7月前
|
SQL NoSQL Oracle
关系型与非关系型数据库的区别
关系型数据库是依据关系模型来创建的数据库,所谓关系模型就是“一对一”、“一对多”、“对多对”等。常见的关系型数据库有Oracle、MySQL、SQL Server等。非关系型数据库主要基于“非关系型模型”,其中非关系型模型有:列模型、键值对模型、文档类模型。比如redis属于键值对模型。 MongoDB属于文档模型 关系型数据库的优点: ● 易于维护:都是使用表结构,格式一致。 ● 使用方便:SQL语言通用,可用于复杂查询。 ● 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。 关系型数据库的缺点: ● 读写性能比较差,尤其是海量数据的高效率读写。 ● 固定的表结构,灵活
|
7月前
|
SQL 存储 关系型数据库
在PG数据库中,not in 和except的区别
在PG数据库中,not in 和except的区别
|
10月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论

热门文章

最新文章