IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis实现分布式锁 -> 正文阅读

[大数据]Redis实现分布式锁

什么是分布式锁

分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性

为什么要分布式锁

当多个线程需要并发修改一个数据时,为了避免竞争,在单机的情况下,加synchronized或者Lock即可实现互斥

但在分布式的环境下,当多个server并发修改同一个资源时,为了避免竞争就需要使用分布式锁。

那为什么不能使用Java自带的锁(synchronized或者Lock)呢?

  • 因为Java中的锁是面向多线程设计的,它只局限于当前的实例。
  • 而多个server实际上是多进程,是不同的实例,所以Java自带的锁机制在这个场景下是无效的。

如何实现分布式锁

采用Redis实现分布式锁,就是在Redis里存一份代表锁的数据,通常用随机字符串即可。

加锁:

第一种方式

setnx key value

这种方式的缺点是容易产生死锁,因为客户端有可能忘记解锁,或者解锁失败。

第二种方式

setnx key value
expire key seconds

给锁增加了过期时间,避免出现死锁。但这两个命令不是原子的,第二步可能会失败,依然无法避免死锁问题。

第三种方式

set key value nx ex seconds 

通过“set…nx…”命令,将加锁、过期命令编排到一起,它们是原子操作了,可以避免死锁。

解锁:

del key

解锁就是删除代表锁的那份数据,直接删除redis上面的数据。

问题

上述方法看起来没有问题,但实际是有隐患的
在这里插入图片描述

  1. 进程A在任务没有执行完毕时,锁已经到期被释放了。
  2. 等进程A的任务执行结束后,A会尝试释放锁,但是,它的锁已经过期不存在了,它此时释放的可能是其他线程的锁,比如B进程;
  3. 红框时间内,两个进程同时操作数据,极有可能出现线程安全的问题;

如何解决

在加锁时就要给锁设置一个标识,加锁进程要记住这个标识。

  • 当进程解锁的时候,进行判断,是自己持有的锁才能释放
  • 否则无法释放。可以为key设置一个随机字符串,来充当进程的标识。

但是解锁的时候,判断、释放,这两步需要保证原子性,否则第二步失败的话,就会出现死锁,但判断和删除命令不是原子的。

在Redis中可以使用Lua脚本,通过Lua脚本将两个命令编排在一起,而整个Lua脚本的执行是原子的。

# 加锁
set key random-value nx ex seconds 

# 解锁
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:35:16  更:2021-10-11 17:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:32:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码