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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 分布式锁是在分布式系统中用于实现多个节点之间的互斥访问共享资源的一种锁机制。它可以确保在分布式环境中的并发操作不会导致数据不一致或冲突。

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

  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的依赖性较高。

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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
1月前
|
存储 分布式计算 负载均衡
分布式计算模型和集群计算模型的区别
【10月更文挑战第18天】分布式计算模型和集群计算模型各有特点和优势,在实际应用中需要根据具体的需求和条件选择合适的计算架构模式,以达到最佳的计算效果和性能。
56 2
|
2月前
|
存储 SQL JSON
介绍一下RDBMS和NoSQL数据库之间的区别
【10月更文挑战第21天】介绍一下RDBMS和NoSQL数据库之间的区别
66 2
|
22天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
15 0
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
45 2
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
50 1
|
3月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
2月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
49 0
|
18天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
32 1