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

SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

文章目录

    • 前言
    • 1、分布式情况下如何加锁
    • 2、具体实现过程
    • 3、测试
      • 3.1 一个服务按照多个端口同时启动
      • 3.2 使用jmeter进行压测

三连哦

前言

上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁

上一篇地址:加锁

1、分布式情况下如何加锁

需要注意的点是: 在上锁和释放锁的过程中要保证原子性操作

在这里插入图片描述

在这里插入图片描述

2、具体实现过程

核心是上锁和解锁的过程

关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX]

//上锁过程
String uuid = UUID.randomUUID().toString();
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);//解锁过程、需要 调用脚本
String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then  return redis.call(\"del\",KEYS[1]) else return 0 end";
Long lock1 = (Long) redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid);
    public Map<String, List<Catalog2Vo>> getCatalogJsonDbWithSpringCache() {//占分布式锁.redis中占坑String uuid = UUID.randomUUID().toString();Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);Map<String, List<Catalog2Vo>> dataFromDb;if (lock) {System.out.println("加锁成功......");try {//加锁成功...执行业务dataFromDb = getCategoriesDb();} finally {//删除锁String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then  return redis.call(\"del\",KEYS[1]) else return 0 end";Long lock1 = (Long) redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid);}return dataFromDb;} else {//加锁失败...重试.synchronized  休眠100ms重试System.out.println("加锁失败......");try {Thread.sleep(200);} catch (Exception e) {}//自旋方式return getCatalogJsonDbWithSpringCache();}}

3、测试

3.1 一个服务按照多个端口同时启动

模拟分布式情况、将一个服务按照多个端口同时启动

具体过程

  • 1 首先,点击修改运行配置在这里插入图片描述

  • 2 将你的项目配置的右上角的Allowl parallel run勾上(允许多启动)在这里插入图片描述

  • 3 将你的项目配置复制一份重启个名字,添加上-Dserver.port=端口号
    在这里插入图片描述

在这里插入图片描述

  • 4 启动项目
    在这里插入图片描述

3.2 使用jmeter进行压测

请求的基本配置

在这里插入图片描述

测试情况
模拟的基本前提: redis中没有缓存数据

上锁成功的情况下、 三个服务中只会出现一次查询数据库、其余接口请求从redis中拿取数据.

下方是测试截图、符合预期情况 、上锁成功

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

redis中缓存的数据
在这里插入图片描述

相关文章:

SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

文章目录前言1、分布式情况下如何加锁2、具体实现过程3、测试3.1 一个服务按照多个端口同时启动3.2 使用jmeter进行压测前言 上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 1、分布式情况下如何加锁 需要注意的点是: 在上锁和释放…...

优漫动游告诉你:平面设计适合你吗?

优漫动游告诉你&#xff1a;平面设计适合你吗&#xff1f; 什么样的同学可以适应平面设计这份工作呢&#xff1f;   略微有美术基础&#xff0c;当然功底越深越加分。   2.对色彩、形状、结构有一定的接纳力。   3.对图案、人像、字体等因素有审美辨别的能力…...

在Vue中,为什么从 props 中解构变量之后再watch它,无法检测到它的变化?

例如下面这段代码&#xff0c;msg无法被watch import { watch } from vue;export default {props: {msg: String},setup(props) {// 从 props 中解构 msgconst { msg } props;watch(() > msg,(newVal, oldVal) > {console.log(newVal, newVal);console.log(oldVal, old…...

[源码解析]socket系统调用上

文章目录socket函数API内核源码sock_createinet_createsock_allocsock_map_fd相关数据结构本文将以socket函数为例&#xff0c;分析它在Linux5.12.10内核中的实现&#xff0c;先观此图&#xff0c;宏观上把握它在内核中的函数调用关系&#xff1a;socket函数API socket 函数原…...

Jenkins部署与自动化构建

Jenkins笔记 文章目录Jenkins笔记[toc]一、安装Jenkinsdocker 安装 JenkinsJava启动war包直接安装二、配置mavenGit自动构建jar包三、自动化发布到测试服务器运行超时机制数据流重定向编写清理Shell脚本四、构建触发器1. 生成API token2. Jenkins项目配置触发器3. 远程Git仓库配…...

网络编程三要素

网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip&#xff1a;IPv4和…...

如何编写一个自己的web前端脚手架

脚手架简介 脚手架是创建前端项目的命令行工具&#xff0c;集成了常用的功能和配置&#xff0c;方便我们快速搭建项目&#xff0c;目前网络上也有很多可供选择的脚手架。 一个"简单脚手架"的构成其实非常少&#xff0c;即 代码模板 命令行工具。其中代码模板是脚手…...

计算机网络第1章(概述)

文章目录1.1、计算机网络在信息时代的作用1.2、因特网概述1、网络、互连网&#xff08;互联网&#xff09;和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成1.3 三种交换方式1、电路交换&#xff08;Circuit Switching&#xff09;2、分组交换&#xff08…...

grid布局

一、概述 CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同&#xff0c;CSS Grid 布局是一个二维布局系统&#xff0c;也就意味着它可以同时处理列和行。通过将 CSS 规则应用于 父元素 (成为 Grid Container 网格容器)和其 子元素&#xff08;成为 Gri…...

博客平台打造出色的个人资料管理与展示:实用技巧与代码示例

个人资料管理与展示是博客平台的重要功能之一。本文将通过设计思路、技术实现和代码示例&#xff0c;详细讲解如何构建出色的个人资料管理与展示功能。结合CodeInsight平台的实践案例&#xff0c;帮助您深入了解个人资料管理与展示的设计原则和技术实现。 一、设计思路 在设计…...

【genius_platform软件平台开发】第九十三讲:串口通信(485通信)

485通信1. 485通信1.1 termios结构1.2 头文件1.3 函数讲解1.3.1 tcgetattr1.3.2 tcsetattr1.4 示例工程1.5 参考文献1.5.1 stty命令1.5.2 命令格式1.5.2 microcom命令1.5.2.1介绍1.5.2.2指令1.5.3 echo命令1.5.3.1 语法1.5.3.2 选项列表1.5.3.3 使用示例1.5.3.4 e cho > 输出…...

JavaScript动画相关讲解

JavaScript是一种非常流行的脚本语言&#xff0c;广泛应用于Web开发、游戏开发、移动应用开发等领域。在Web开发中&#xff0c;动画效果是非常重要的一部分&#xff0c;可以提高网站的用户体验和吸引力。JavaScript提供了一些基本的动画函数&#xff0c;但是这些函数往往不能满…...

InnoSetup制作安装包(EXE)

功能描述 1.666666.war为项目war包&#xff0c;666666.bat为启动war包脚本&#xff0c;通过InnoSetup将它们打包到安装包666666.exe 2.666666.exe安装包安装过程中将666666.bat注册为自启动服务&#xff0c;安装结束自动执行脚本启动项目666666.war --------------------------…...

CASE WHEN函数语句多条件下使用详解

目录 CASE 的两种格式&#xff1a; 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句&#xff0c;实现简单CASE函数和CASE搜索函数两种格式。同时配合 SUM以及COUNT方法的使用 CASE 的两种格式&#xff1a; 简…...

2.31、守护进程(2)

2.31、守护进程&#xff08;2&#xff09;1.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤 执行一个 fork()&#xff0c;之后父进程退出&#xff0c;子进程继续执…...

记录上传文件异常 /tmp/tomcat... (No space left on device)

一&#xff0c;问题描述 用postman调用上传接口&#xff0c;基本每两次调用会有一次报错&#xff0c;如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…...

无向连通图中长度为 n 的循环

给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …...

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT&#xff0c;要多少人才能开发出来&#xff1f;几百&#xff0c;还是几千&#xff1f; 答案是&#xff1a;87个人。 老实说&#xff0c;刚看到这个数字真是惊到我了&#xff0c;印象里&#xff0c;之前看媒体报道各大巨头人工智能人才储备时&#xff0c;动辄…...

数据结构——栈与队列相关题目

数据结构——栈与队列相关题目232. 用栈实现队列思路225. 用队列实现栈1.两个队列实现栈2.一个队列实现栈20. 有效的括号思路1047. 删除字符串中的所有相邻重复项思路155. 最小栈150. 逆波兰表达式求值思路239. 滑动窗口最大值单调队列347. 前 K 个高频元素思路232. 用栈实现队…...

Redhat6.7离线安装rabbitmq

一、下载资源文件&#xff08;.rpm文件&#xff09; 链接: https://pan.baidu.com/s/1j2Ze_Jjm0oMrP-r95PPCtA?pwdv3is 提取码: v3is 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 创建rabbit文件夹Mkdir rabbit 三、通过ftp上传文件 四、安装erlang环境 …...

终极指南:如何用UI-TARS桌面版实现零代码智能桌面自动化

终极指南&#xff1a;如何用UI-TARS桌面版实现零代码智能桌面自动化 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …...

T2080工控主板开发实战:从核心特性到系统部署全解析

1. 项目概述&#xff1a;从一块“硬核”主板说起 最近在整理手头的嵌入式项目资料&#xff0c;翻出了一块来自东大金智科技的T2080工控主板。这块板子在我经手过的众多嵌入式平台里&#xff0c;算是相当有“分量”的一位——不是指物理重量&#xff0c;而是其内在的“硬核”实力…...

离线语音技术如何重塑智能照明:从核心原理到产品实战

1. 从“在线”到“离线”&#xff1a;智能照明交互的范式转变作为一名在智能家居领域摸爬滚打了十来年的从业者&#xff0c;我亲眼见证了智能照明从最初的手机APP遥控&#xff0c;到后来的智能音箱联动&#xff0c;再到如今离线语音技术的兴起。每次技术迭代&#xff0c;都不仅…...

ElevenLabs奥里亚文语音合规性警告:印度《2023语言技术法案》生效后,这4类商用场景必须重做语音备案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs奥里亚文语音合规性警告的背景与紧迫性 ElevenLabs 作为领先的文本转语音&#xff08;TTS&#xff09;服务提供商&#xff0c;近期在其 API 文档与开发者控制台中新增了针对奥里亚文&#xf…...

Cesium实战:手把手教你用JavaScript实现5个酷炫的3D地图特效(雷达扫描/淹没分析/动态绘制)

Cesium实战&#xff1a;手把手教你用JavaScript实现5个酷炫的3D地图特效&#xff08;雷达扫描/淹没分析/动态绘制&#xff09; 在三维地理信息可视化领域&#xff0c;Cesium凭借其强大的WebGL渲染能力和灵活的JavaScript API&#xff0c;已成为开发者构建沉浸式空间应用的首选引…...

每日大赛间歇期通过Taotoken模型广场探索新模型特性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 每日大赛间歇期通过Taotoken模型广场探索新模型特性 对于每日参与各类AI应用开发或创意大赛的选手而言&#xff0c;比赛间歇期并非…...

国民技术N32G030K8L7芯片,用MDK从官方FTP下载到点亮LED的保姆级教程

国民技术N32G030K8L7芯片开发实战&#xff1a;从资料获取到LED点亮的全流程指南 拿到一块全新的开发板时&#xff0c;那种既兴奋又忐忑的心情想必每位工程师都经历过。N32G030K8L7作为国民技术推出的高性价比MCU&#xff0c;凭借其出色的性能和丰富的外设资源&#xff0c;正成为…...

终极B站缓存视频转换指南:快速将m4s无损转换为MP4

终极B站缓存视频转换指南&#xff1a;快速将m4s无损转换为MP4 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经因为B站视频突然下架而感…...

别再死记硬背了!用Python脚本帮你自动生成CANopen PDO映射表(附源码)

用Python自动化生成CANopen PDO映射表的工程实践 每次面对密密麻麻的CANopen设备描述文件时&#xff0c;你是否也经历过这样的场景&#xff1a;深夜加班核对PDO映射参数&#xff0c;反复翻阅数百页的EDS文档&#xff0c;稍不留神就会把0x1800错配成0x1801。这种低效的手工操作不…...

别再被CUDA版本搞懵了!PyTorch环境配置保姆级避坑指南(含conda与本地安装对比)

深度学习环境配置终极指南&#xff1a;PyTorch与CUDA版本匹配的实战解决方案 1. 理解CUDA与PyTorch版本冲突的本质 当你第一次在终端看到"RuntimeError: The detected CUDA version mismatches the version that was used to compile PyTorch"这个错误时&#xff0c;…...