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

本文涉及的产品
云数据库 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
相关文章
|
1天前
|
传感器 边缘计算 监控
边缘云作为一种分布式云计算架构,正在为多个行业和应用场景带来革命性的变化
边缘云应用于智能城市、工业物联网、零售、农业、AI、5G优化、制造、物流、医疗、交通和家居等领域,实现低延迟的数据处理、实时分析与优化。例如,智能交通利用边缘计算优化信号灯,减少拥堵;工业场景中,设备监控与预测性维护提升效率;在医疗中,实时监测患者数据支持远程诊断。此外,边缘云还助力零售业的个性化推荐、农业的精准作业和云游戏的高性能体验。
|
3天前
|
分布式计算 资源调度 Hadoop
分布式系统详解--架构(Hadoop-克隆服务器)
分布式系统详解--架构(Hadoop-克隆服务器)
12 1
|
3天前
|
负载均衡 算法 架构师
系统架构设计师-软件水平考试(高级)-论文-可靠性设计
系统架构设计师-软件水平考试(高级)-论文-可靠性设计
11 1
|
19天前
|
存储 算法 Linux
|
19天前
|
存储 数据采集 SQL
|
18天前
|
存储 缓存 NoSQL
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
|
2天前
|
监控 持续交付 数据安全/隐私保护
Python进行微服务架构的监控
【6月更文挑战第16天】
17 5
Python进行微服务架构的监控
|
1天前
|
监控 Kubernetes API
探索微服务架构中的API网关模式
【6月更文挑战第22天】在微服务架构的海洋中,API网关是一艘引领航行的旗舰。它不仅是服务的守门人,更是流量的指挥官和信息的翻译官。本文将深入探讨API网关的核心作用、设计考量与实现策略,为构建高效、可靠的微服务系统提供航标。
|
1天前
|
JSON 负载均衡 监控
探索微服务架构中的API网关模式
【6月更文挑战第22天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务间的通信与集成。本文将深入探讨API网关的核心概念、设计原则及其在现代后端系统中的关键作用,同时通过实例分析其对系统性能和可维护性的影响,为读者提供一种视角,理解如何高效地构建和管理微服务架构下的API网关。
|
1天前
|
运维 Kubernetes 监控
自动化运维的新篇章:容器化与微服务架构的融合
【6月更文挑战第22天】在数字化时代的浪潮中,企业IT架构正经历着一场深刻的变革。本文将探讨自动化运维如何通过容器化技术与微服务架构的结合,提升系统的可维护性、扩展性和敏捷性。我们将深入分析这一结合背后的技术细节,以及它如何影响日常运维工作,同时提供一系列实用的操作建议和最佳实践。