redis里面的分布式锁的作用和分布式锁的实现
分布式锁在 Redis 中的作用
在分布式系统中,多个服务实例或进程可能会同时访问和操作共享资源,若缺乏有效的同步机制,就会引发数据不一致、并发冲突等问题。
1、保证数据一致性:在分布式环境下,多个客户端可能同时对同一数据进行读写操作。使用 Redis 分布式锁可以确保同一时间只有一个客户端能够修改数据,避免出现数据冲突和不一致的情况。例如,在电商系统中,多个订单处理服务可能同时处理库存扣减操作,如果不使用分布式锁,可能会导致库存超卖的问题。通过使用 Redis 分布式锁,只有获取到锁的服务才能进行库存扣减,从而保证库存数据的准确性。
2、避免并发问题:多个客户端可能会同时执行相同的业务逻辑,如定时任务、数据更新等。Redis 分布式锁可以避免这些任务在不同的节点上同时执行,从而避免并发问题。例如,在分布式系统中,每天凌晨需要对数据进行备份操作,如果不使用分布式锁,可能会导致多个节点同时进行备份,造成资源浪费和数据混乱。通过使用 Redis 分布式锁,只有一个节点能够获取到锁并执行备份任务,其他节点则等待锁释放。
3、提高系统可靠性:Redis 是一个高性能、高可用的内存数据库,使用 Redis 作为分布式锁的存储介质可以提高系统的可靠性。Redis 支持主从复制和集群模式,可以在节点故障时自动进行故障转移,确保分布式锁的正常使用。
分布式锁的实现方式
1、SETNX + EXPIRE:setnx+ expire命令。即先用setnx来抢锁,如果抢到之后,再用expire给锁设置一个过期时间,防止锁忘记了释放。
if(jedis.setnx(key_resource_id,lock_value) == 1){ //加锁
expire(key_resource_id,100); //设置过期时间
try {
do something //业务请求
}catch(){
}
finally {
jedis.del(key_resource_id); //释放锁
}
}
2、SETNX + value值是(系统时间+过期时间):解决方案一,发生异常锁得不到释放的场景,过期时间放到setnx的value值里面。如果加锁失败,再拿出value值校验一下即可。
long expires = System.currentTimeMillis() + expireTime; //系统时间+设置的过期时间
String expiresStr = String.valueOf(expires);
// 如果当前锁不存在,返回加锁成功
if (jedis.setnx(key_resource_id, expiresStr) == 1) {
return true;
}
// 如果锁已经存在,获取锁的过期时间
String currentValueStr = jedis.get(key_resource_id);
// 如果获取到的过期时间,小于系统当前时间,表示已经过期
if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) {
// 锁已过期,获取上一个锁的过期时间,并设置现在锁的过期时间(不了解redis的getSet命令的小伙伴,可以去官网看下哈)
String oldValueStr = jedis.getSet(key_resource_id, expiresStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {
// 考虑多线程并发的情况,只有一个线程的设置值和当前值相同,它才可以加锁
return true;
}
}
//其他情况,均返回加锁失败
return false;
}
3、使用Lua脚本(包含SETNX + EXPIRE两条指令):我们还可以使用Lua脚本来保证原子性(包含setnx和expire两条指令)
if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then
redis.call('expire',KEYS[1],ARGV[2])
else
return 0
end;
4、Redisson框架:获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。(看门狗机制)
redis里面的分布式锁的作用和分布式锁的实现的更多相关文章
- Redis 当成数据库在使用和可靠的分布式锁,Redlock 真的可行么?
怎样做可靠的分布式锁,Redlock 真的可行么? https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html ...
- 【redis】分布式锁实现,与分布式定时任务
如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...
- Redis避坑指南:为什么要有分布式锁?
作者:京东保险 张江涛 1.为什么要有分布式锁? JUC提供的锁机制,可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑: 多服务多节点的情况下,就意味着有多个JVM进程,要做到这样,就需要 ...
- 终极锁实战:单JVM锁+分布式锁
目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...
- 分布式改造剧集2---DIY分布式锁
前言: 好了,终于又开始播放分布式改造剧集了.前面一集中(http://www.cnblogs.com/Kidezyq/p/8748961.html)我们DIY了一个Hessian转发实现,最后我 ...
- [Re:从零开始的分布式] 0.x——Reids实现分布式锁
上节提到了,分布式锁通常应满足如下要求,互斥性.高可用.高效率.可重入.锁失效这五个基本原则.由于Redis自身“快”的特点,所以高效率可以看作满足. 下文在单机情况下与多机情况下,对利用Redis实 ...
- 【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)
1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...
- 【分布式锁】06-Zookeeper实现分布式锁:可重入锁源码分析
前言 前面已经讲解了Redis的客户端Redission是怎么实现分布式锁的,大多都深入到源码级别. 在分布式系统中,常见的分布式锁实现方案还有Zookeeper,接下来会深入研究Zookeeper是 ...
- 【分布式锁】07-Zookeeper实现分布式锁:Semaphore、读写锁实现原理
前言 前面已经讲解了Zookeeper可重入锁的实现原理,自己对分布式锁也有了更深的认知. 我在公众号中发了一个疑问,相比于Redis来说,Zookeeper的实现方式要更好一些,即便Redis作者实 ...
- 整理分布式锁:业务场景&分布式锁家族&实现原理
1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...
随机推荐
- 企业级MediaWiki知识库系统搭建部署指南(CentOS 8)
## 一.高级环境准备 ### 1. 系统优化与安全加固 ```bash # 系统更新与内核优化 sudo dnf update -y --security sudo dnf install kern ...
- 2024牛客多校3A Bridging the Gap 2
希望更丰富的展现?来我搭建的网站看看 Problem \(n\) 个人乘船过河,该船容纳人的上限为 \(R\),并且需要至少 \(L\) 个人才能操作.每次过河时所有人都需划船,使船上所有人的耐力值减 ...
- Vue 学习笔记 [Part 3]
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 〇.高阶函数 0.1 filter() 0.2 map() 0.3 reduce() 一. 表单绑定v-model 1.1. v-model的 ...
- Flannel相关问题记录
k8s的Pod无法分配IP 报错信息 E0222 07:22:36.762074 83 remote_runtime.go:113] RunPodSandbox from runtime servic ...
- UFT 的三种方法获取时间
- 四、设备修改开机logo
2.1.修改开机logo 图片文件路径 (替换以下文件): ./kernel/logo.bmp ./kernel/logo_kernel.bmp 设备树配置路径(配置为开启显示logo): ./boo ...
- 打砖块小游戏html小游戏
这里提供一个打砖块小游戏html代码,有需要的小伙伴可以自己试试. body内容 点击查看代码 <select id="difficulty"> <option ...
- FastAPI中的敏感数据如何在不泄露的情况下翩翩起舞?
扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 以下是关于FastAPI框架中敏 ...
- 故障处理:Oracle一体机更换磁盘控制器后部分磁盘状态异常的案例处理
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- Excel加载宏.xla文件的使用方法
将文件保存到本地的一个位置. 2.打开任意的excel表格,并按照如下的图片所示的步骤操作: 1)点击development(开发工具)add-ins浏览,然后找到刚刚文件的保存位置并选择文件(如果没 ...