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刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...
随机推荐
- ActiveMQ消息投递方式+死信队列
死信队列 死信队列(Dead Letter Queue,DLQ),用来保存处理失败或者过期的信息.出现以下情况的时候,消息会被重发: 在一个事务session中调用了session.rollback( ...
- 洛谷 P6625 [省选联考 2020 B 卷] 卡牌游戏
洛谷 P6625 [省选联考 2020 B 卷] 卡牌游戏 题目传送门 Solution 每次操作的得分都是一个前缀和,即每次的得分为\(p=\sum_\limits{i=1}^ka_i(2\le k ...
- FastAPI安全认证:从密码到令牌的魔法之旅
title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdrag ...
- 生长算法和巡中线算法python实现代码示例(自用)
生长算法和巡中线算法python实现代码示例(自用) import cv2 import time import numpy as np from math import pi, isnan # PI ...
- 【服务器备份方案】基于Duplicati+Alist+阿里云盘的备份方案
服务器备份方案 该博文转载自我的个人博客:小树 | 服务器备份方案 前言 在我们实际的生产环境中,由于云服务存在很多的不稳定性,因此对服务器进行定时备份就很有必要了. 虽然部分服务器厂商提供了快照备份 ...
- h5 移动端适配方案
h5 移动端适配方案 设定viewport 打开public\index.html,在html\head结点下加入<meta name="viewport" content= ...
- 开源共建 | Dinky 扩展批流统一数据集成框架 ChunJun 的实践分享
一.前言 ChunJun(原FlinkX)是一个基于 Flink 提供易用.稳定.高效的批流统一的数据集成工具,既可以采集静态的数据,比如 MySQL,HDFS 等,也可以采集实时变化的数据,比如 b ...
- vert.x 初识
中文文档:https://vertx-china.github.io/ 官方文档:https://vertx.io/ 客户端仓库模块:https://github.com/vert-x3/vertx- ...
- 五、Linux系统常用调试工具
4.2.ps(查看进程状态) 用途:显示系统中运行的进程及其相关信息,如 PID(进程 ID).CPU 使用率.内存占用等. 常见用法: ps aux # 显示所有进程,包含用户.PID.CPU/内存 ...
- XXL-JOB分布式任务调度平台
简介 概述 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 特性 1.简单:支持通过Web页面对任务进行 ...