redis面试(二十一)读写锁互斥

读锁非互斥

非互斥的意思就是,一个客户端或者线程加锁之后,另一个客户端线程也可以来进行加锁。
还是拿着ReadLock的lua脚本来看看
在这里插入图片描述
刚才我们已经分析过第一个线程来加读锁的逻辑了
所以上半截不用重复说了,
hset anyLock mode read
hset anyLock UUID_01:threadId_01 1
set {anyLock}:UUID_01:threadId_01:rwlock_timeout:1 1
pexpire {anyLock}:UUID_01:threadId_01:rwlock_timeout:1 30000
pexpire anyLock 30000

当前的数据结构是这样的

anyLock: {
“mode”: “read”,
“UUID_01:threadId_01”: 1
}

此时另一个客户端B也要来加读锁,我们来看一下这时候的参数
KEYS[1] = anyLock
KEYS[2] = {anyLock}:UUID_02:threadId_02:rwlock_timeout

ARGV[1] = 30000毫秒
ARGV[2] = UUID_02:threadId_02
ARGV[3] = UUID_02:threadId_02:read
判断mode这个值是不是等于read,在开头的时候这个值就取出来了,这个锁是不是读锁,是的话可以直接进入下面的逻辑。

并且,判断一下,如果当前是写锁的话,但是写锁是自己当前这个线程,是可以进去加读锁的,如果写锁不是自己加的,就不能加读锁了

这就是读锁与读锁的非互斥、读锁与写锁的互斥。
if (mode == ‘read’) or (mode == ‘write’ and redis.call(‘hexists’, KEYS[1], ARGV[3]) == 1) then

那再往下的逻辑中,就是往读锁结构中添加键值对
hincrby anyLock UUID_02:threadId_02 1
set {anyLock}:UUID_02:threadId_02:rwlock_timeout:1 1
pexpire anyLock 30000
pexpire {anyLock}:UUID_02:threadId_02:rwlock_timeout:1 30000
添加完后长这样

anyLock: {
“mode”: “read”,
“UUID_01:threadId_01”: 1,
“UUID_02:threadId_02”: 1
}

读锁与写锁互斥

先加读锁后加写锁

上面的lua脚本有判断
if (mode == ‘read’) or (mode == ‘write’ and redis.call(‘hexists’, KEYS[1], ARGV[3]) == 1) then
如果当前锁是read ,而要加的锁是 write的话,直接返回进入线程等待。

先加写锁后加读锁的话,要看写锁的加锁逻辑

这里mode对应的值如果不是write的话,直接返回,加锁线程进入等待。在这里插入图片描述

写锁和写锁的互斥

还是上面的lua脚本,如果说当前的数据中mode对应值是write的话,
要判断里面的线程是否是自己当前线程,如果是的话,就可以进去,如果不是的话,就不能加锁

如果这时候进去了, 那就是当前线程加锁的可重入逻辑
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409831.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端微服务架构:构建分布式博客系统

后端微服务架构:构建分布式博客系统 在当今的软件开发领域,微服务架构已经成为构建可扩展、灵活且易于维护的应用程序的主流选择。本文将探讨如何利用微服务架构来设计和实现一个分布式的博客系统。 1. 微服务架构简介 微服务架构是一种将应用程序分解…

【微服务部署】Linux部署微服务启动报ORA-01005

问题背景: Linux机器部署springboot微服务,部署完成后发现无法启动,后台报ORA-01005错误。 解决方案: 1.检查当前服务器是否已安装oracle客户端 命令行执行sqlplus username/passwd实例名,如果执行成功,说…

微信小程序源码 图书管理系统 万字文档 Springboot vue

源码地址 系统演示 SpringBoot vue 微信小程序源码 图书管理系统 附带运行教程 系统演示 万字文档,全套开发工具 开发工具:IDEA,微信小程序工具 数据库:mysql8 使用环境:Windows JDK版本:1.8 后端构建工具:maven 项目使用到的技术栈 Springboot2 mybatis vue Mys…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

领域驱动设计DDD详解与战术建模落地

一、什么是DDD? 1.1、DDD的概念 Domain-Driven Design(领域驱动设计)它由Eric Evans在他的2003年出版的书籍《Domain-Driven Design: Tackling Complexity in the Heart of Software》中首次提出。DDD 核心思想是通过领域驱动设计方法定义领…

透明度测试

1、透明测试是用于处理哪种透明需求 在游戏开发中对象的某些部位完全透明而其他部位完全不透明,这种透明需求往往不需要半透明效果,相对比较极端,只有看得见和看不见之分比如树叶、草、栅栏等等。(即一张图除了主要物体有颜色,其…

奇文网盘项目对应windows版本的中间件下载,otp,rabbitmq,postgresql,onlyoffice(在线预览编辑等)

之前的解压是百度网盘,要会员,油猴也无法下载,所有我下载之后给你们提供阿里云盘链接(不限速) 本次软件版本介绍: 01-otp_win64_24.1 02-rabbitmq-server-3.9.8 03-postgresql-9.6.23-2-windows-x64 0…

如何解决错误Given calling package android does not match caller‘s uid-学员提问

背景: 近来有学员反馈说wms课程中讲解的借壳Shell帮忙执行一些shell命令有问题,具体啥问题呢? 在ShellProvider的call方法加入如下代码: 目的就是想让shell帮我们执行一下settings值的写入,这里其实可以更加简单的set…

Linux 定时备份

背景:为防止数据丢失,要求每天备份一次 以达梦数据库为例,每天定时备份 1.填写备份脚本 vi db_day_backup.sh #!/bin/bash DIR$(cd $(dirname $0) && pwd) tarnamedata.tar_$(date %Y%m%d) cd $DIR if [[ $(find $DIR/ -name $tar…

腾讯提出一种新的针对风格化角色和逼真服装动画的生成3D运动转移方法,生成效果逼真!

来自腾讯XR视觉实验室的研究团队提出了一种创新的3D运动转移方法,专门针对风格化角色和逼真服装动画的生成。该方法能够将源动作准确地映射到目标角色上,同时考虑了角色身体的刚性变形和服装的局部物理动态变形。 与现有技术相比,这技术不仅…

4、Unity【基础】画线功能Linerenderer、物理系统Physics

文章目录 画线功能Linerenderer1、LineRenderer是什么2、LineRender参数相关3、LineRender代码相关思考1 请写一个方法,传入一个中心点,传入一个半径,用LineRender画个圆出来思考2 在Game窗口长按鼠标用LineRender画出鼠标移动的轨迹 核心系统…

Axure设计之单选框教程(中继器)

在Axure RP中,通过结合中继器的强大功能,我们可以轻松实现动态加载的单选框列表,不仅可以根据数据自动调整选项宽度,还能实时更新选中状态。本教程将引导你完成一个使用中继器制作动态单选框列表的项目,包括案例分析、…

Linux文件IO缓存

一、缓冲区大小对 I/O 系统调用性能的影响 总之,如果与文件发生大量的数据传输,通过采用大块空间缓冲数据,以及执行更少的 系统调用,可以极大地提高 I / O 性能 二、stdio 库的缓冲 当操作磁盘文件时,缓冲大块数据以…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例 引言 树数据结构(Tree Data Structures)作为计算机科学中的基石之一,以其独特的层次结构和分支特性,在众多领域发…

IIS中检测不到AspNetCoreModuleV2模块

安装了.net 2.2 的runtime(运行时),但是在IIS中还是没有检测出来AspNetCoreModuleV2模块 解决方案: 其实问题点主要是选错了包,选成了x64,应该选择Hosting Bundle,这个是与IIS有关的。 之后下…

HW数通IA笔记2-网络参考模型

目录 零、本章主要内容 一、应用和数据 二、网络参考模型与标准协议 2.2 TCP/IP参考模型 2.3 TCP/IP常见协议 2.3.1 应用层 2.3.2 传输层 2.3.3 网络层 2.3.4 数据链路层 2.3.5 物理层 2.4 常见的协议标准化组织 三、数据的通信过程 零、本章主要内容 1、理解数据的…

SpringBoot集成kafka-生产者发送消息

springboot集成kafka发送消息 1、kafkaTemplate.send()方法1.1、springboot集成kafka发送消息Message对象消息1.2、springboot集成kafka发送ProducerRecord对象消息1.3、springboot集成kafka发送指定分区消息 2、kafkaTemplate.sendDefault()方法3、kafkaTemplate.send(...)和k…

关于elementui table组件 —— 竖向表格

前端模拟数据方式&#xff1a; html代码&#x1f447;&#xff1a; <template><el-table :data"tableData" style"width: 60%;margin-top:20px" stripe :show-header"false" border :row-style"rowStyle"><el-table…

MyBatis如何自定义项目中SQL日志

说明&#xff1a;用过MyBatis框架的同学们都知道&#xff0c;打印SQL日志&#xff0c;可以通过在application.yml配置文件中加入下面配置来设置&#xff1a; mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl但打印出来的SQL如下&#xff0c;丑陋…

机器学习/数据分析--通俗语言带你入门决策树(结合分类和回归案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…