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

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁

  • 模拟抢券场景
      • 通过下面方法添加Synchronized锁来防止上述情况,
        • 如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁
        • 端口8080和8081同时访问,那么两个线程会同时加锁
        • 这时候我们需要用分布式锁
  • Redis 分布式锁实现原理
        • Redis实现分布式锁如何合理的控制锁的有效时长?
        • 1.根据业务执行时间预估,2.给锁续期,但是第一种根据业务执行的时间预估依然可能会出现问题,所以我们采用第二种方案给锁续期,但是我们要自己再开一个线程一直关注这个锁吗?Redis 分布式锁就可以实现
      • 加锁,设置过期时间等操作都是基于lua脚本完成
    • 主从一致性
      • 红锁

在这里插入图片描述

模拟抢券场景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过下面方法添加Synchronized锁来防止上述情况,

在这里插入图片描述

如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁

在这里插入图片描述
在这里插入图片描述

端口8080和8081同时访问,那么两个线程会同时加锁

这时候我们需要用分布式锁

在这里插入图片描述
8080端口在进行线程1的时候,进行加锁,此时8081的进行访问的时候获取互斥锁失败,可以保证数据一致

Redis 分布式锁实现原理

在这里插入图片描述
为什么要设置过期时间?如果不设置过期时间的话,有可能导致死锁的问题。

Redis实现分布式锁如何合理的控制锁的有效时长?

1.根据业务执行时间预估,2.给锁续期,但是第一种根据业务执行的时间预估依然可能会出现问题,所以我们采用第二种方案给锁续期,但是我们要自己再开一个线程一直关注这个锁吗?Redis 分布式锁就可以实现

在这里插入图片描述

下面这个线程加锁成功的话,跟上面的流程是一样的,如果加锁不成功,就会循环,不断尝试获取锁,但是也不会一直循环,有设置阈值,循环次数达到阈值就会停止
具体代码:
在这里插入图片描述

加锁,设置过期时间等操作都是基于lua脚本完成

在这里插入图片描述
add1 方法加锁 ,Value.value = 1, 之后调用add2 方法加锁,Value.value = 2, add2 释放锁 Value.value-1变成1 ,之后add1 释放锁 Value.value-1变成0

只有同一个线程才会重入

主从一致性

在这里插入图片描述
假如现在在写入数据到主节点,这时候主节点宕机了,会有一个从节点变成主节点,当有请求来了,继续写入数据,也会尝试获取锁,因为之前的数据没同步过来,这时候就会造成两个线程同时持有同一把锁,但是这样就没有互斥性了,业务还在执行就可能会产生脏数据,因此在Redis中还提供了另外一种锁——红锁

红锁

在这里插入图片描述
其中 n 代表redis中节点的数量,创建锁的个数要大于等于节点的一半才行,来解决主从不一致的问题,但是这种方法实现复杂,性能查并且运维繁琐。
Redis 的思想是AP思想,保证数据最终一致,但是如果必须保证完全实时一致,就需要用CP思想,用zookeeper

在这里插入图片描述
在这里插入图片描述

相关文章:

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景通过下面方法添加Synchronized锁来防止上述情况,如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁端口8080和8081同时访问&#xf…...

压力测试-商场项目

1.压力测试 压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向系统发送预…...

IDEA中文UT方法执行报错问题、wps默认保存格式

wps默认保存格式、IDEA中文UT方法执行报错问题 背景 1、wps修改文件后,编码格式从UTF-8-bom变成UTF-8(notepad可以查看); 2、IDEA中文UT执行报错: 解决方案 1、语言设置中不要勾选 “Beta版。。。。” 2、cmd中执…...

Vue如何实现编程式导航声明方法,前进和后退导航

编程式导航声明方法,前进和后退导航 在router中设置路由导航跳转函数 只要发生跳转 导航的声明函数 访问控制系统如何形成 就这三种 导航守卫的案例,写一个Main.Vue 和login .Vue 后台主页 如果想要展示后台主页,就用这种方法 想实现路由跳转…...

torch.load 报错 ModuleNotFoundError 或 AttributeError

Python 3.11.3 (main, Apr 7 2023, 19:25:52) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin Type "help", "copyright", "credits" or "license" for more information.正常情况下,我们会使用 torch.save 保存模型的 …...

前端,js , Error in created hook: TypeError ,有bug了

怎么兄弟,遇到bug了???你开心吗,哈哈哈哈...

百度文心千帆大模型平台:企业级大模型服务的新航标

随着人工智能和大数据的快速发展,大模型平台正越来越受到各大企业和个人开发者的青睐。本文将以百度最新推出的文心千帆大模型平台为例,深入分析其在国家战略布局,经济发展趋势,市场变化动向和技术研发周期等方面的影响和应用。同…...

uniApp低功耗蓝牙一键开门、多对多查找、数组匹配数组、开锁

文章目录 htmlJavaScript坑 html <view class"m_t_36"><view class"w_50_ h_100 lh_100 m_l_a m_r_a bc_409eff radius_10 color_fff ta_c" click"openBluetoothAdapter()">一键开门</view> </view>JavaScript export…...

类和对象|六个默认成员函数|const成员函数|运算符重载

文章目录 默认成员构造函数1. 构造函数1.1 概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2 特性 4. 运算符重载4.1 赋值重载4.2 自增自减重载4.3 取地址操作符重载 5. const成员函数6. 取地址重载 默认成员构造函数 上一节我们说过&#xff0c;空类的大…...

从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解&#xff0c;用于处理应用程序中的异常。当应用程序中发生异常时&#xff0c;ExceptionHandler将优先地拦截异常并处理它&#xff0c;然后将处理结果返回到前端。该注解可用于类级别和方法级别&#xff0c;…...

04mysql查询语句之查询与分页02

1. 所有有门派的人员信息 &#xff08; A、B两表共有&#xff09; INSERT INTO t_dept(deptName,address) VALUES(华山,华山); INSERT INTO t_dept(deptName,address) VALUES(丐帮,洛阳); INSERT INTO t_dept(deptName,address) VALUES(峨眉,峨眉山); INSERT INTO t_dept(deptN…...

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…...

[SQL挖掘机] - 多表连接

介绍: 在 SQL 中&#xff0c;多表连接是指将多个表根据某些条件进行联接&#xff0c;以获取相关联的数据。这允许我们跨多个表进行查询&#xff0c;并且根据表之间的关系获取所需的结果。 作用: 当在多个表中存储相关数据时&#xff0c;使用多表连接可以将这些表组合起来以获…...

Day 14 C++ 对象的初始化和清理

目录 为什么要进行对象的初始化和清理 构造函数和析构函数 构造函数&#xff08;Constructor&#xff09; 构造函数语法 调用时机 构造函数的调用方式 括号法 显式法 隐式转换法 构造函数分类 分类方式 按参数分为有参构造和无参构造 按类型分为普通构造和拷贝构造…...

Delphi7最佳登录窗体设计

Delphi7我们这里用登录窗体来做演示。输入正确用户名和密码后&#xff0c;登录窗体释放&#xff0c;显示主窗体。 方法/步骤 1.打开Delphi7集成开发环境&#xff0c;在默认工程的Form1窗体放置一个Label1控件&#xff0c;拖动控件边界调整大小&#xff0c;并将Object Inspect…...

动脑学院Jetpack Compose学习笔记

最近b站学习了一下Compose相关内容&#xff0c;整理了相关笔记&#xff0c;仅供大家参考。 资源链接如下&#xff0c;象征性收取1个积分 https://download.csdn.net/download/juliantem/88125198...

Qt中线程的使用

Qt中线程的使用 在qt中线程的使用有两种方式&#xff0c;第一种就是创建一个类继承QObject类&#xff0c;之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类&#xff0c;在类中实现run函数。 第一种方式&#xff1a; 1、首先创建一个自定义的类…...

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…...

【已解决】电脑连上网线但无法上网

文章目录 案例情况解决方案必要的解决方法简要概括详细步骤1、打开控制面板2、打开更改适配器设置3、 找Internet协议版本44、修改配置 可能有用的解决方法 问题解决原理Internet 协议版本 4&#xff08;TCP/IPv4&#xff09;确保IP地址和DNS服务器设置为自动获取 案例情况 网…...

Linux 学习记录57(ARM篇)

Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…...

Doris注意事项,Doris部署在阿里云,写不进去数据

1.Doris官网 Doris官网https://doris.apache.org/ 2.根本原因 本地idea访问FE&#xff0c;FE会返回BE的地址&#xff0c;但是在服务器上通过ip addr查看&#xff0c;发现只有局域网IP&#xff0c;所以FE返回了局域网的IP&#xff0c;导致idea连接不上BE 3.解决办法 重写Ba…...

502 Bad GateWay报错的解决方法

什么是502 bad gateway 报错 简单来说 502 是报错类型代码 bad gateway 错误的网关。是Web服务器作为网关或代理服务器时收到无效的响应。 用我们的口语说就是运行网站的服务器暂时挂了(不响应)。 产生错误的原因 1.连接超时 我们向服务器发送请求 由于服务器当前链接太多&am…...

openpnp - ReferenceStripFeeder 改版零件

文章目录 openpnp - ReferenceStripFeeder 改版零件概述笔记整体效果散料飞达主体磁铁仓盖板飞达编带中间压条飞达编带两边压条装配体用的8mm编带模型END openpnp - ReferenceStripFeeder 改版零件 概述 官方推荐了ReferenceStripFeeder的模型smd_strip_feeders_mod_tray.zip…...

VoxPoser:使用大语言模型(GPT-4)来对机器人操作的可组合三维值图【论文解读】

这是最近斯坦福的李飞飞团队的一篇论文:VoxPoser: Composable 3D Value Maps for Robotic Manipulation with Language Models 主要是通过大语言模型LLM和视觉语言模型VLM结合&#xff0c;来对机器人做各种日常操作&#xff0c;我们可以先来看下实际效果&#xff1a;大语言模型…...

RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”

RISC-V公测平台Web Server地址&#xff1a;http://175.8.161.253:8081 一、前言 Web Server是互联网应用的基础设施&#xff0c;无论是用户访问网站&#xff0c;还是后端服务提供商和开发者构建各种应用程序&#xff0c;Web Server都在其中扮演着至关重要的角色。 显而易见…...

Linux 发行版 CentOS 于 Ubuntu 软件的安装、卸载、查找

CentOS于Ubuntu 内核都是Linux&#xff0c;是一样的。 CentOS 软件格式 .rpm sudo yum [-y] [ install | remove | search ] 软件名称 install 安装 remove 移除 search 搜索 Ubuntu 软件格式 .deb sudo apt [-y] [ install | remove | search ] 软件名称 install 安装 remove…...

cmd相关操作命令

1.根据端口号查询对应进程的PID netstat -ano | findstr 端口号 例如&#xff1a;netstat -ano | findstr 9080&#xff1b;该端口所属进程的PID为6684 2.根据PID查询对应进程 tasklist | findstr PID 例如&#xff1a;tasklist | findstr 6684&#xff1b;该PID所属进程名为…...

使用EM算法完成聚类任务

EM算法&#xff08;Expectation-Maximization Algorithm&#xff09;是一种基于迭代优化的聚类算法&#xff0c;用于在无监督的情况下将数据集分成几个不同的组或簇。EM算法是一种迭代算法&#xff0c;包含两个主要步骤&#xff1a;期望步骤&#xff08;E-step&#xff09;和最…...

❤️创意网页:创意视觉效果粒子循环的网页动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…...

【MTI 6.S081 Lab】thread

【MTI 6.S081 Lab】thread 前言调度Uthread: switching between threads (moderate)实验任务Hints解决方案thread_switchthread_create()thread_schedule() Using threads (moderate)实验任务解决方案 Barrier (moderate)实验任务解决方案 本实验前去看《操作系统导论》第29章基…...

php做网站python做什么/网站关键词查询

前言&#xff1a;针对大型集散过程控制系统&#xff0c;其IO点数往往很多&#xff0c;成千上万&#xff0c;AB Logix5000控制器的开发软件Studio 5000是基于标签编程&#xff0c;对硬件模块的绝对IO地址&#xff0c;采用的是别名标签方式进行映射&#xff0c;目前而言&#xff…...

lamp wordpress环境/seo系统推广

点击蓝字关注我们小年到福喜到SPRING FESTIVAL新年吹响集结号请财神&#xff0c;请灶神财富梦想在燃烧办年货&#xff0c;蒸年糕新年展望步步高随着小年到&#xff0c;2021年的春节也开始进入倒计时国内的疫情还在持续发酵&#xff0c;国家也是号召大家就地过年&#xff1b;但“…...

互联网平面设计/网络优化工资一般多少

本来以为iPad已经把平板的大概趋势勾勒出来了&#xff0c;结果微软Surface又把平板和台式机进行了折中&#xff0c;而Nexus 7平板在走它的小资不创新道路&#xff0c;平板电脑的方向在哪里、如何杀出平板红海&#xff1f; 通过咨询13个科技领袖对平板趋势的意见&#xff0c;他们…...

网站怎样做域名绑定/网站关键词有哪些

Fraunhofer IIS 音频水印技术 Translated by Wilco and 苏信东&#xff0c;WaveCN.com校对&#xff1a;苏信东2005-12-16 音频水印技术 “水印”这一术语与信息隐藏科学高度关联。所谓信息隐藏&#xff0c;可以理解为在一种信息中隐藏附带另外一种信息。因此&#xff0c;音频水…...

企业网站建设哪家便宜/营销策略国内外文献综述

常用的几条NET命令&#xff1a; 1. 知道对方ip查看对方的计算机名 方法&#xff1a;开始->运行->cmd->net view 对方ip 或者 开始->运行->cmd->nbtstat -a 对方ip 2. 知道对方计算机名查看对方ip 方法&#xff1a;开始->运行->cmd->ping 对方计算机…...

最专业的网站建设组织/搜索引擎优化seo多少钱

initWithFrame&#xff1a; 通过代码创建UI控件的时候就会调用&#xff1b; initWithCoder&#xff1a;从文件中解析一个对象的时候就会调用这个方法&#xff0c;也就是说无论是通过代码还是xib&#xff0c;程序运行的时候都会调用这个方法&#xff1b; awakeFromNib&#xff…...