五种分布式锁(分布式锁实现方案)
ccwgpt 2024-10-31 12:32 36 浏览 0 评论
序
- 什么是分布式锁?
- 基于数据库的分布式锁(一)
- 基于缓存的分布式锁——Redis锁(二)
- 基于ZooKeeper的分布式锁(三)
- 基于分布式算法的锁(如基于Raft或Paxos的锁)四
- 基于文件锁的分布式锁(五)
- 用Go+Lua实现基于Redis的分布式锁
- Raft算法是什么?
- 基于文件锁的分布式锁如何实现?
- ……
开始吧~~
什么是分布式锁?
分布式锁(Distributed Lock)是一种用于在分布式系统中协调多个进程或线程访问共享资源的同步机制。它的主要目的是确保在分布式环境下,同一时刻只有一个进程或线程可以访问共享资源,以防止数据竞争和不一致性问题。
一、两个关键操作:
- 获取锁:进程或线程尝试获取锁以访问共享资源。如果锁是可用的,获取锁的操作成功,该进程或线程可以访问资源。如果锁已被其他进程或线程获取,尝试获取锁的操作会被阻塞或失败。
- 释放锁:进程或线程在使用完共享资源后,释放锁,使其他进程或线程能够获取锁并访问资源。
二、要求和特性:
- 互斥性:同一时刻只有一个进程或线程可以获得锁,确保资源的独占性。
- 可重入性:允许已经持有锁的进程或线程重新获取该锁,以防止死锁。
- 超时机制:支持设置锁的超时时间,以防止锁被长时间占用。
- 容错性:在分布式系统中,要能够处理节点故障、网络分区等异常情况,以确保锁的可用性。
- 高性能:锁的实现应尽量减少性能开销,以适应高并发的情况。
分布式锁在分布式系统中用于协调资源访问、任务调度、避免并发问题等方面发挥着重要作用。
基于数据库的分布式锁(一)
一、特点:
使用数据库表的行或记录来表示锁,利用数据库的事务支持来实现锁的获取和释放。
二、优势:
持久性好,可靠性高,适用于需要持久性的锁。
三、劣势:
性能相对较低,可能引起数据库负载,不适用于高并发情况。
基于缓存的分布式锁——Redis锁(二)
一、特点:
使用缓存服务器(如Redis)来存储锁信息,通过缓存的原子操作来获取和释放锁。
二、优势:
性能较高,支持自动过期,适用于高并发环境,易于部署。
三、劣势:
可能存在锁的不可重入性,需要处理锁的过期问题。
基于ZooKeeper的分布式锁(三)
一、特点:
使用ZooKeeper这种分布式协调服务来实现锁管理,利用ZooKeeper的顺序节点来确定锁的获取顺序。
二、优势:
具有强一致性,适用于复杂的分布式协作场景,支持公平锁。
三、劣势:
相对复杂,性能不如缓存锁。
四、代码示例:
package main
import (
"github.com/samuel/go-zookeeper/zk"
"time"
)
var zkServers = []string{
"zookeeper-server-1:2181",
"zookeeper-server-2:2181",
"zookeeper-server-3:2181",
}
var conn *zk.Conn
func init() {
var err error
conn, _, err = zk.Connect(zkServers, time.Second)
if err != nil {
panic(err)
}
}
// 获取锁
func acquireLock(lockPath string) (*zk.Lock, error) {
lock := zk.NewLock(conn, lockPath, zk.WorldACL(zk.PermAll))
if err := lock.Lock(); err != nil {
return nil, err
}
return lock, nil
}
// 释放锁
func releaseLock(lock *zk.Lock) {
lock.Unlock()
}
// 使用锁
func main() {
lockPath := "/my_lock"
lock, err := acquireLock(lockPath)
if err != nil {
panic(err)
}
// 成功获取锁,执行需要锁定的代码
// 释放锁
releaseLock(lock)
}
基于分布式算法的锁(如基于Raft或Paxos的锁)四
一、特点:
使用分布式一致性算法来实现锁管理,通常需要专门的分布式系统架构。
二、优势:
提供强一致性,适用于分布式系统中需要高度可靠性的场景。
三、劣势:
复杂度较高,性能开销大。
基于文件锁的分布式锁(五)
一、特点:
使用分布式文件系统或共享文件来实现锁管理,需要文件系统的支持。
二、优势:
可靠性高,适用于需要持久性的场景。
三、劣势:
性能较低,依赖于文件系统的性能和可用性。
用Go+Lua实现基于Redis的分布式锁
使用 Redis 的 SETNX 命令来尝试获取锁,并使用 Lua 脚本来安全地释放锁。
package main
import (
"fmt"
"github.com/go-redis/redis"
"time"
)
var redisClient *redis.Client
func init() {
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis服务器地址
Password: "", // 密码,如果有的话
DB: 0, // Redis数据库编号
})
}
func acquireLock(key string, value string, expiration time.Duration) (bool, error) {
result, err := redisClient.SetNX(key, value, expiration).Result()
return result, err
}
func releaseLock(key string, value string) error {
script := `
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
`
return redisClient.Eval(script, []string{key}, value).Err()
}
func main() {
lockKey := "my_lock"
lockValue := "my_value"
expiration := 10 * time.Second
// 尝试获取锁
locked, err := acquireLock(lockKey, lockValue, expiration)
if err != nil {
fmt.Println("Error acquiring lock:", err)
return
}
if locked {
// 成功获取锁
fmt.Println("Lock acquired")
// 执行需要加锁的代码
// 释放锁
err := releaseLock(lockKey, lockValue)
if err != nil {
fmt.Println("Error releasing lock:", err)
} else {
fmt.Println("Lock released")
}
} else {
// 未能获取锁
fmt.Println("Failed to acquire lock")
}
}
Raft算法是什么?
Raft(Raft Consensus Algorithm)是一种分布式一致性算法,用于在分布式系统中实现一致性和可用性。旨在解决分布式系统中的一致性问题,尤其是在分布式存储系统中的应用非常广泛。
Raft算法的设计目标是提供更容易理解和实现的一致性算法,相对于之前的Paxos算法来说,更容易被普通开发人员理解和应用。Raft算法的核心思想是通过选举机制,将系统中的节点分为领导者(leader)、跟随者(follower)和候选者(candidate)三种角色,其中领导者负责提出提案、复制日志和处理客户端请求,而跟随者和候选者则遵循领导者的指令。
Raft算法的关键特点包括:
- 领导者选举:Raft通过定期的选举过程来选出领导者,只有领导者才能接受客户端的请求。如果领导者宕机或失去联系,会触发新一轮选举,确保系统中仍然有领导者。
- 日志复制:领导者负责提出日志项(log entries),并将它们复制到其他节点的日志中,以确保数据的一致性。
- 安全性:Raft算法被设计为拥有良好的安全性属性,能够防止多种故障情况下的数据丢失和不一致性问题。
- 易于理解和实现:相对于一些更复杂的一致性算法,如Paxos,Raft的设计更为直观和容易理解,这使得它更适合教育和应用开发。
基于文件锁的分布式锁如何实现?
分布式文件锁是一种分布式锁的实现方式,它使用共享文件系统来协调多个进程或节点对共享资源的访问。
- 选择合适的共享文件系统:首先,你需要选择一个支持分布式文件共享的文件系统,例如NFS(Network File System)、Ceph、GlusterFS等。这个文件系统应该能够被多个节点访问,并且提供文件锁机制。
- 创建共享锁文件:在共享文件系统上创建一个专门用于锁的文件,例如一个空的占位文件。这个文件将用于表示锁的状态。
- 获取锁:当进程或节点需要获取锁时,它会尝试在共享文件系统上创建一个特定的锁文件,如一个临时文件,以表示锁的获取。你可以使用文件系统提供的原子创建文件的操作来实现这一步。
- 检查锁状态:在尝试创建锁文件后,进程需要检查共享文件系统中的锁文件的状态。如果锁文件已存在,表示锁已被其他进程或节点占用,当前进程需要等待或执行相应的锁冲突解决策略。
- 释放锁:当进程或节点不再需要锁时,它会删除在共享文件系统上创建的锁文件,以释放锁。这将使其他进程能够获取锁。
- 处理锁的过期和故障情况:需要考虑处理锁的过期问题,以防止锁被长时间占用。此外,还需要处理共享文件系统的故障或节点故障等异常情况,确保锁的可用性。
实际的分布式文件锁实现可能会更复杂,因为它需要处理分布式系统中的各种问题,如网络分区、节点故障、锁的竞争等。
我为人人,人人为我,美美与共,天下大同。
#妙笔生创作挑战##程序员##程序员经验分享##计算机##编程##分布式存储##IT##本地达人计划##一张图告别十月#
相关推荐
- 详解DNFSB2毒王的各种改动以及大概的加点框架
-
首先附上改动部分,然后逐项分析第一个,毒攻掌握技能意思是力量智力差距超过15%的话差距会被强行缩小到15%,差距不到15%则无效。举例:2000力量,1650智力,2000*0.85=1700,则智力...
- 通篇干货!纵观 PolarDB-X 并行计算框架
-
作者:玄弟七锋PolarDB-X面向HTAP的混合执行器一文详细说明了PolarDB-X执行器设计的初衷,其初衷一直是致力于为PolarDB-X注入并行计算的能力,兼顾TP和AP场景,逐渐...
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
-
梦晨发自凹非寺量子位|公众号QbitAI字节最新深度思考模型,在数学、代码等多项推理任务中超过DeepSeek-R1了?而且参数规模更小。同样是MoE架构,字节新模型Seed-Thinkin...
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
-
作者|赵骁勇阿里巴巴智能引擎事业部审校|刘侃,KittyRTP-LLM是阿里巴巴大模型预测团队开发的高性能LLM推理加速引擎。它在阿里巴巴集团内广泛应用,支撑着淘宝、天猫、高德、饿...
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
-
校园系统通常是为学校、学生和教职工提供便捷的数字化管理工具。综合性社交大学校园小程序源码:同城校园小程序-大学校园圈子创业分享,校园趣事,同校跑腿交友综合性论坛。小程序系统基于TP6+Uni-app...
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
-
婚恋交友系统-打造您的专属婚恋交友平台系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包...
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
-
COMET团队投稿量子位|公众号QbitAI字节对MoE模型训练成本再砍一刀,成本可节省40%!刚刚,豆包大模型团队在GitHub上开源了叫做COMET的MoE优化技术。COMET已应用于字节...
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
-
2025年2月19日,美国通用电气航空航天公司(隶属于通用电气公司)宣布,已经完成了“下一代自适应推进系统”(NGAP)计划下提供的XA102自适应变循环发动机的详细设计审查阶段。XA102是通用电气...
- tpxm-19双相钢材质(双相钢f60材质)
-
TPXM-19双相钢是一种特殊的钢材,其独特的化学成分、机械性能以及广泛的应用场景使其在各行业中占有独特的地位。以下是对TPXM-19双相钢的详细介绍。**化学成分**TPXM-19双相钢的主要化学成...
- thinkphp6里怎么给layui数据表格输送数据接口
-
layui官网已经下架了,但是产品还是可以使用。今天一个朋友问我怎么给layui数据表格发送数据接口,当然他是学前端的,后端不怎么懂,自学了tp框架问我怎么调用。其实官方文档上就有相应的数据格式,js...
- 完美可用的全媒体广告精准营销服务平台PHP源码
-
今天测试了一套php开发的企业网站展示平台,还是非常不错的,下面来给大家说一下这套系统。1、系统架构这是一套基于ThinkPHP框架开发的HTML5响应式全媒体广告精准营销服务平台PHP源码。现在基于...
- 一对一源码开发,九大方面完善基础架构
-
以往的直播大多数都是一对多进行直播社交,弊端在于不能满足到每个用户的需求,会降低软件的体验感。伴随着用户需求量的增加,一对一直播源码开始出现。一个完整的一对一直播流程即主播发起直播→观看进入房间观看→...
- Int J Biol Macromol .|交联酶聚集体在分级共价有机骨架上的固定化:用于卤代醇不对称合成的高稳定酶纳米反应器
-
大家好,今天推送的文章发表在InternationalJournalofBiologicalMacromolecules上的“Immobilizationofcross-linkeden...
- 【推荐】一款开源免费的 ChatGPT 聊天管理系统,支持PC、H5等多端
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍GPTCMS是一款开源且免费(基于GPL-3.0协议开源)的ChatGPT聊天管理系统,它基于先进的GPT...
- 高性能计算(HPC)分布式训练:训练框架、混合精度、计算图优化
-
在深度学习模型愈发庞大的今天,分布式训练、高效计算和资源优化已成为AI开发者的必修课。本文将从数据并行vs模型并行、主流训练框架(如PyTorchDDP、DeepSpeed)、混合精度训练(...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 详解DNFSB2毒王的各种改动以及大概的加点框架
- 通篇干货!纵观 PolarDB-X 并行计算框架
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
- tpxm-19双相钢材质(双相钢f60材质)
- thinkphp6里怎么给layui数据表格输送数据接口
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)