当前位置: 首页 > news >正文

分布式锁相关问题(三)

Redis实战精讲-13小时彻底学会Redis
一、什么是分布式锁?
要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。

l 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。

l 进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。

l 分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。

二、分布式锁的使用场景。
线程间并发问题和进程间并发问题都是可以通过分布式锁解决的,但是强烈不建议这样做!因为采用分布式锁解决这些小问题是非常消耗资源的!分布式锁应该用来解决分布式情况下的多进程并发问题才是最合适的。有这样一个情境,线程A和线程B都共享某个变量X。

如果是单机情况下(单JVM),线程之间共享内存,只要使用线程锁就可以解决并发问题。

如果是分布式情况下(多JVM),线程A和线程B很可能不是在同一JVM中,这样线程锁就无法起到作用了,这时候就要用到分布式锁来解决。

三、分布式锁的实现
分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了Redis。首先我们要搭建一个Redis服务器,用Redis服务器来存储锁信息。

在实现的时候要注意的几个关键点:

  1. 锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;
  2. 同一时刻只能有一个线程获取到锁。

几个要用到的redis命令:

setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0。

get(key):获得key对应的value值,若不存在则返回nil。

getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value。

expire(key, seconds):设置key-value的有效期为seconds秒。

分布式锁的三种实现方式

  1. 数据库乐观锁;
  2. 基于Redis的分布式锁;
  3. 基于ZooKeeper的分布式锁。
http://www.lryc.cn/news/273513.html

相关文章:

  • grep!Linux系统下强大的文本搜索工具!
  • (学习打卡1)重学Java设计模式之设计模式介绍
  • docker 部署教学版本
  • 2023春季李宏毅机器学习笔记 05 :机器如何生成图像
  • C#和C++存储 和 解析 bin 文件
  • 【React系列】Redux(二)中间件
  • YOLOv8改进 | 2023Neck篇 | 利用Gold-YOLO改进YOLOv8对小目标检测
  • ubuntu环境安装配置nginx流程
  • 【LMM 010】MiniGPT-v2:使用独特的标识符实现视觉语言多任务学习的统一的多模态大模型
  • 人工智能如何重塑金融服务业
  • Iterable 对象转换为 Stream 对象
  • 基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现
  • 2024,启动(回顾我的2023)
  • Web网页开发-盒模型-笔记
  • Java打成压缩包的方法汇总
  • 2023年第2季社区Task挑战赛贡献者榜单
  • Clickhouse 为什么快
  • 【React系列】react-router
  • [数据集][目标检测]车辆检测数据集VOC+YOLO格式1.6w张3类别
  • FindMy技术用于鼠标
  • 已解决‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。”的问题
  • 基于PGPGPOOL-II部署PostgreSQL高可用环境
  • 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建
  • Python 操作 JMeter 探索:pymeter 实操指南
  • 微软 Power Platform 使用Power Automate发送邮件以Dataverse作为数据源的附件File Column
  • 雾天条件下 SLS 融合网络的三维目标检测
  • 在pycharm中执行 os.makedirs 提示用户名或密码不正确
  • 使用Go语言编写高效的HTTP服务器
  • 代码随想录day20 开始二叉搜索树
  • 从0开始python学习-39.requsts库