2024软考架构师考试---分布式锁的实现方式有那些以及优缺点

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【6月更文挑战第16天】在分布式系统中,分布式锁是一种用于控制对共享资源访问的机制,以确保多进程、多线程环境下的数据一致性。分布式锁有多种实现方式,本文将介绍几种常见的分布式锁及其优缺点。

在分布式系统中,分布式锁是一种用于控制对共享资源访问的机制,以确保多进程、多线程环境下的数据一致性。分布式锁有多种实现方式,本文将介绍几种常见的分布式锁及其优缺点。

一、基于数据库的分布式锁

实现方式

  1. 表锁:使用数据库提供的锁机制,例如 MySQL 的 SELECT ... FOR UPDATE 语句。
  2. 乐观锁:使用版本号或时间戳字段进行并发控制。
  3. 悲观锁:在表中添加一个锁定状态字段,通过更新该字段实现锁定。

优点

  • 实现简单,易于理解。
  • 适合小规模的分布式系统和已有的数据库环境。

缺点

  • 性能较低,数据库的 IO 开销较大。
  • 存在单点故障问题,即数据库故障导致锁机制失效。
  • 扩展性差,不适合高并发场景。

示例代码(基于 MySQL 表锁)

sql复制代码

-- 创建锁表
CREATE TABLE `distributed_lock` (
    `resource` VARCHAR(64) NOT NULL PRIMARY KEY,
    `locked` TINYINT(1) NOT NULL DEFAULT 0,
    `owner` VARCHAR(64) NOT NULL
);

-- 获取锁
INSERT INTO distributed_lock (resource, locked, owner) VALUES ('resource_name', 1, 'node_id')
ON DUPLICATE KEY UPDATE locked = IF(locked = 0, 1, locked), owner = IF(locked = 0, 'node_id', owner);

-- 释放锁
UPDATE distributed_lock SET locked = 0 WHERE resource = 'resource_name' AND owner = 'node_id';

二、基于缓存(如 Redis)的分布式锁

实现方式

使用 Redis 的 SETNX 命令或 Redisson 等库实现分布式锁。

优点

  • 性能较高,Redis 作为内存数据库,读写速度快。
  • 支持高并发,适合大规模分布式系统。
  • 实现相对简单,社区有成熟的解决方案。

缺点

  • 存在单点故障问题,需要配置 Redis 集群或哨兵模式。
  • 需要额外的 Redis 依赖和运维成本。

示例代码(基于 Redis 的 SETNX

java复制代码

import redis.clients.jedis.Jedis;

public class RedisLock {

    private Jedis jedis;
    private String lockKey;
    private long lockTimeout;

    public RedisLock(Jedis jedis, String lockKey, long lockTimeout) {
        this.jedis = jedis;
        this.lockKey = lockKey;
        this.lockTimeout = lockTimeout;
    }

    public boolean tryLock(String value) {
        long end = System.currentTimeMillis() + lockTimeout;
        while (System.currentTimeMillis() < end) {
            if (jedis.setnx(lockKey, value) == 1) {
                jedis.expire(lockKey, (int) (lockTimeout / 1000));
                return true;
            }
            if (jedis.ttl(lockKey) == -1) {
                jedis.expire(lockKey, (int) (lockTimeout / 1000));
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        return false;
    }

    public void unlock(String value) {
        if (value.equals(jedis.get(lockKey))) {
            jedis.del(lockKey);
        }
    }
}

三、基于 Zookeeper 的分布式锁

实现方式

使用 Zookeeper 的临时有序节点(Ephemeral Sequential Nodes)实现分布式锁。

优点

  • 强一致性,Zookeeper 通过 Paxos 算法保证数据一致性。
  • 高可靠性,Zookeeper 集群提供高可用性。
  • 支持高并发,适合大规模分布式系统。

缺点

  • 实现复杂度较高,相比其他方式需要更多的配置和维护。
  • 性能不如 Redis,在极高并发下可能成为瓶颈。

示例代码(基于 Curator 框架)

java复制代码

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;

public class ZookeeperLock {

    private InterProcessMutex lock;

    public ZookeeperLock(CuratorFramework client, String lockPath) {
        this.lock = new InterProcessMutex(client, lockPath);
    }

    public void lock() throws Exception {
        lock.acquire();
    }

    public void unlock() throws Exception {
        lock.release();
    }
}

四、基于 Etcd 的分布式锁

实现方式

使用 Etcd 的分布式锁 API 或基于租约机制实现分布式锁。

优点

  • 高可用性,Etcd 提供高可用集群(Raft 协议)。
  • 强一致性,Etcd 保证数据一致性。
  • 适合云原生环境,Kubernetes 使用 Etcd 作为其数据存储。

缺点

  • 相对较新的技术,社区和文档支持不如 Zookeeper。
  • 实现复杂度较高,需要额外的 Etcd 依赖和配置。

示例代码(基于 Etcd Java 客户端)

java复制代码

import io.etcd.jetcd.Client;
import io.etcd.jetcd.lock.LockResponse;
import io.etcd.jetcd.options.PutOption;

public class EtcdLock {

    private Client client;
    private String lockKey;
    private long leaseId;

    public EtcdLock(Client client, String lockKey) {
        this.client = client;
        this.lockKey = lockKey;
    }

    public boolean lock() {
        try {
            leaseId = client.getLeaseClient().grant(5).get().getID();
            LockResponse response = client.getLockClient().lock(lockKey.getBytes(), leaseId).get();
            return response != null;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public void unlock() {
        try {
            client.getLockClient().unlock(lockKey.getBytes()).get();
            client.getLeaseClient().revoke(leaseId).get();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

比较与总结

锁实现方式 优点 缺点
数据库锁 实现简单,易于理解 性能低,存在单点故障,扩展性差
Redis 锁 性能高,支持高并发,社区支持好 存在单点故障,需额外依赖和运维成本
Zookeeper 锁 强一致性,高可靠性,适合大规模系统 实现复杂度高,性能可能成为瓶颈
Etcd 锁 高可用性,强一致性,适合云原生环境 实现复杂度高,相对较新,社区支持较少

不同的实现方式各有优缺点,具体选择哪种分布式锁实现方式,取决于具体应用场景及系统需求。对于高并发、高性能要求的场景,Redis 锁通常是不错的选择;而对于需要强一致性和高可靠性的场景,Zookeeper 或 Etcd 则更为适合。希望本文的介绍能帮助你在实际项目中更好地选择和应用分布式锁技术。



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
存储 JSON 数据库
Elasticsearch 分布式架构解析
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,以其高可扩展性和实时性著称。它基于 Lucene 开发,但提供了更高级别的抽象,使得开发者能够轻松地构建复杂的搜索应用。本文将深入探讨 Elasticsearch 的分布式存储和检索机制,解释其背后的原理及其优势。
191 5
|
15天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
55 4
|
29天前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
1月前
|
存储 安全 API
单元化架构,分布式系统的新王!
【10月更文挑战第9天】
109 0
单元化架构,分布式系统的新王!
|
1月前
|
架构师 NoSQL 大数据
复习七天通过软考高级系统架构师经历
复习七天通过软考高级系统架构师经历
|
1月前
|
消息中间件 架构师 Cloud Native
软考高级系统架构师论文,到底该怎么写
软考高级系统架构师论文,到底该怎么写
116 0
|
1月前
|
消息中间件 分布式计算 Kafka
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
大数据-98 Spark 集群 Spark Streaming 基础概述 架构概念 执行流程 优缺点
39 0
|
1月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
47 0