- 产生背景
服务器集群模式下需要对临界资源实现互斥访问 - 实现方案
- 基于数据库
使用唯一索引或排他锁来实现。
缺点是IO限制导致的性能较差,同时支持功能太少,需要额外开发锁超时、锁失效等功能。 - 基于KV缓存
一般通过redis来实现。
一种是单机方案,即通过单个redis实例,set key value ex/px timeout nx语句实现加锁,通过lua脚本比较key和value实现解锁,通过watchDog看门狗来实现业务运行时间超过“锁超时时间”时的续期,该方案问题在于单点故障问题;
另一种是哨兵模式方案, 通过引入主从架构和哨兵机制,提升了系统的鲁棒性,但仍然会有主从切换时分布式锁可能被同时获取、以及由于网络原因导致的“脑裂”(多个master节点)等问题;
第三种是RedLock方案,通过多个并列的redis实例提升系统的鲁棒性,加锁时需要对每个redis实例都加锁,只有超过一半的实例都加锁成功才算加锁成功。这种方案极大恶化了性能,同时在一些边界情况如某个redis实例中的锁过期时客户端在GC导致仍然在使用锁等场景仍然有问题 - 基于一致性协议
一般通过zookeeper实现,主要借助临时有序节点和watcher机制,客户端在获取锁时,会在zookeeper中创建一个临时有序节点(先创建的节点序号更小,优先级更高),序号最小的节点能获取到锁,同时通过watcher机制观察节点状态,当客户端解锁时,对应的临时有序节点会在zookeeper中注销,watcher观察到节点注销后,会通知下一个序号最小的节点获取到锁。
zookeeper是鲁棒性最强的方案,但是在一些极边界情况下,仍然有问题,比如客户端网络异常会导致对应临时有序节点被注销,这样就会有新的客户端能拿到锁,可能就造成了锁被同时持有。
- 基于数据库
- 方案选型
- 对性能没要求,对分布式锁的功能需求也极简单,可以考虑数据库方案,但一般不建议。
- 对性能要求高,允许极端情况容错,可以采用Redis的方案。
- 对性能要求较高,同时对一致性要求相当严格,可以采用zookeeper的方案。
分布式锁简介
张小明
前端开发工程师
GUID为什么不会重复?
GUID为什么不会重复? GUID/UUID (全局唯一标识符)之所以被认为“几乎不会重复”,是因为其庞大的组合空间和精心设计的生成算法,使得在现实世界中重复的概率低到可以忽略不计。 以下是 GUID 不会重复的核心原因: 1. 庞…
E-Hentai批量下载工具:高效管理数字收藏资源的最佳方案
在数字资源日益丰富的今天,如何高效管理和保存有价值的在线内容成为了许多用户的共同痛点。面对心仪的图库资源,传统的手动保存方式不仅效率低下,还容易导致文件混乱。针对这一需求,E-Hentai-Downloader提供了一个简单而强大的解决…
布隆过滤器
一、布隆过滤器 1. 什么是布隆过滤器? 布隆过滤器是一种空间效率极高的概率型数据结构,核心作用是快速判断「一个元素是否存在于集合中」。它的特点可以总结为: 说「元素不在」→ 100%准确(绝对没在集合里);…
【JESD22-B109C】倒装芯片拉伸测试
B109C 测试方法:Flip Chip Tensile Pull 倒装芯片拉伸测试1 范围本测试方法适用于芯片与基板焊点形成后、未涂覆底部填充胶或其他会提高表观结合强度的材料前的倒装芯片。其用途包括:评估特定倒装芯片的芯片接合工艺一致性与质量;评估特定倒装…
2025年应届生闭坑指南:如何挑选低费用、高认可度的AI技能证书?
随着人工智能技术席卷各行各业,手握相关技能证书已成为应届毕业生提升就业竞争力的重要筹码。然而,面对市场上琳琅满目、价格不一的认证项目,许多同学不禁感到迷茫:如何避开“高价低能”的坑,选择一款既具高含金量又不…
基于YOLOv12农作物检测系统1:农作物检测数据集说明(含下载链接)
一. 前言 本篇博客是《基于YOLOv12农作物检测系统》系列文章之《农作物检测数据集说明(含下载链接)》,网上有很多农作物检测数据集的数据,百度一下,一搜一大堆,但质量参差不齐,很多不能用,即使一个一个的看…