谷粒商城:Redisson

目录

Redisson

整合Redisson

 RLock

RReadWriteLock

RSemaphore

RCountDownLatch

优化三级分类缓存

缓存一致性问题

双写模式

失效模式

脏数据解决


Redisson

提供redis分布式锁(Distributed locks with Redis)的java客户端

整合Redisson

引入

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></dependency>

程序化配置

@Configuration
public class RedissonConfig {@Value("${spring.redis.host}"+":"+"${spring.redis.port}")private String singleAddress;@Bean(destroyMethod = "shutdown")public RedissonClient redisson() throws IOException {Config config = new Config();/*SingleServer() 单节点模式redis:// redis 连接协议*/config.useSingleServer().setAddress("redis://"+singleAddress);return Redisson.create(config);}
}

 RLock

可重入锁(Reentrant Lock)它允许同一个线程多次获取同一把锁而不会产生死锁。

RLock lock = redisson.getLock("myLock");// 尝试获取锁,最多等待10秒,锁有效期30秒
boolean res = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (res) {try {// 业务代码} finally {lock.unlock();}
}
  1. 可重入性:同一线程可多次获取同一把锁

  2. 锁续期:内置看门狗机制自动续期

  3. 公平锁:支持公平锁和非公平锁

  4. 锁释放:确保只有锁持有者能释放锁


RReadWriteLock

读写锁,它允许多个读操作同时进行,但写操作是排他的。

RReadWriteLock rwLock = redisson.getReadWriteLock("myReadWriteLock");
RLock readLock = rwLock.readLock();  // 获取读锁
RLock writeLock = rwLock.writeLock(); // 获取写锁
writeLock.lock();  // 先获取写锁
try {// 写操作...// 保持写锁的同时获取读锁(锁降级)readLock.lock();try {// 读操作...} finally {// 注意:这里不能释放写锁}// 可以继续持有写锁做其他操作
} finally {writeLock.unlock();  // 最后释放写锁// 此时仍持有读锁
}
  1. 读写分离

    • 多个线程可以同时持有读锁

    • 写锁是排他的,有写锁时不能有读锁或其他写锁

  2. 可重入性

    • 读锁和写锁都支持可重入

    • 同一线程可以多次获取同一把读锁或写锁

  3. 锁降级

    • 支持将写锁降级为读锁

    • 但不支持读锁升级为写锁(会死锁)

  4. 公平性选择

    • 支持公平和非公平两种模式


RSemaphore

 信号量,它允许多个线程/进程在分布式环境中协调对共享资源的访问

// 获取信号量实例(初始许可数为5)
RSemaphore semaphore = redisson.getSemaphore("mySemaphore");
semaphore.trySetPermits(5);  // 初始化许可数量// 获取1个许可(阻塞直到可用)
semaphore.acquire();try {// 访问受限资源accessLimitedResource();
} finally {// 释放许可semaphore.release();
}
  1. 资源限制:控制同时访问特定资源的线程/进程数量

  2. 分布式支持:跨JVM、跨服务器的协调能力

  3. 公平性选择:支持公平和非公平两种模式

  4. 可重入:支持同一线程多次获取许可

  5. 超时机制:支持尝试获取许可的超时设置

典型应用场景

  1. 限流控制:限制系统并发请求数

  2. 资源池管理:如数据库连接池控制

  3. 任务调度:限制同时执行的任务数量

  4. API访问限制:控制第三方API调用频率


RCountDownLatch

闭锁,它允许一个或多个线程等待其他线程完成操作后再继续执行。

RCountDownLatch latch = redisson.getCountDownLatch("myLatch");// 初始化计数器为5
latch.trySetCount(5);// 减少计数器(每个工作线程完成后调用)
latch.countDown();//获取当前计数
long remaining = latch.getCount();// 等待计数器归零(阻塞)
latch.await();// 带超时的等待
boolean reached = latch.await(10, TimeUnit.SECONDS);

  1. 一次性使用:计数器归零后不能重置(与JDK的CountDownLatch一致)

  2. 等待/通知机制:线程可以等待计数器归零

  3. 可视化监控:可通过Redis直接查看当前计数状态

典型应用场景

  1. 分布式任务同步:等待多个分布式任务完成

  2. 系统初始化:等待所有服务初始化完成

  3. 批量处理:等待所有子任务处理完成

  4. 测试协调:分布式测试中的线程协调


优化三级分类缓存

    @Overridepublic Map<String, List<Level2CategoryVo>> getLevel2AndLevel3Category() {//1.先从缓存中获取 catalogJsonValueOperations<String,String> valueOperations = redisTemplate.opsForValue();String catalogJson = valueOperations.get("catalogJson");Map<String, List<Level2CategoryVo>> res = null;if(StringUtils.isEmpty(catalogJson)){//缓存中无对应数据,查询数据库res = getCatalogJsonFromDBWithRedissonLock();}else{res = JSON.parseObject(catalogJson,new TypeReference<Map<String, List<Level2CategoryVo>> >(){});}return res;}/*** 获取 Redisson 分布式锁,查询数据库* @return*/private Map<String, List<Level2CategoryVo>> getCatalogJsonFromDBWithRedissonLock(){Map<String, List<Level2CategoryVo>> res = null;RLock lock = redisson.getLock("CatalogJson-Lock");lock.lock();//成功获取到锁try {res = getCatalogJsonFromDB();}finally {lock.unlock();}return res;}

缓存一致性问题

双写模式

修改数据库,并修改缓存。

    失效模式

    修改数据库后,删除缓存,下一次查询时缓存数据。

    脏数据解决

    俩种模式都会产生暂时的脏数据,解决方案:

    1. 读写锁
    2. 过期时间,保证最终一致性
    3. 一致性要求高的数据,不存入缓存,应直接查询数据库

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

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

    相关文章

    Linux系统调用编程

    目录 一. 理解进程和线程的概念。并在Linux系统下进行相应操作 1.1概念 1.1.1进程(Process) 1.1.2 线程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系统中各进程的编号pid 1.2.2用kill 命令终止一个进程pid 二. 解释Linux的“虚拟内存管理”&#xff0c;它与stm32中的 真…

    25-智慧旅游系统(协同算法)三端

    介绍 技术&#xff1a; 基于 B/S 架构 SpringBootMySQLLayuivue 环境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首页展示图表&#xff1a;以数据可视化方式展示关键业务数据。 用户管理&#xff1a;管理系统用户&#xff0c;包括查看、编辑等操作。 供应商管…

    【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

    串口通信-Hal库实现不定长度收发&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程创建&#xff09;基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前&#xff0c;我们先来一起简单了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接内…

    沉浸式体验测评|AI Ville:我在Web3小镇“生活”了一周

    最近&#xff0c;我在朋友的推荐下&#xff0c;体验了 aivillebot 的项目。起初&#xff0c;我只是抱着试试看的心态&#xff0c;心想这不就是个 Web3 版的《星露谷物语》吗&#xff1f; 但是一周下来&#xff0c;我发现这个虚拟小镇也没那么简单——里面的居民不是目前端游或链…

    FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现

    一、核心功能设计 按键暂停/继续&#xff1a;通过KEY1控制计时状态 按键消抖处理&#xff1a;20ms消抖周期消除机械抖动 硬件资源分配&#xff1a;符合DE2-115开发板引脚规范 二、核心模块实现详解 1. 顶层模块&#xff08;counter&#xff09; module counter(input CL…

    后端开发 SpringBoot 工程模板

    概述 本篇文章主要记录如何开发一个通用的 SpringBoot 工程开发框架的项目模板&#xff0c;这样后续需要开发项目时就可以直接开箱直用了&#xff0c;省区了很多重复步骤。 项目初始化 创建项目&#xff1a; 按照我的选项来选&#xff0c;然后点击 create&#xff0c;等待文…

    OpenCv(五)——边缘检测

    目录 边缘检测 一、sobel算子边缘检测 &#xff08;1&#xff09;原理 1、X轴方向的边缘检测 2、Y轴方向的边缘检测 &#xff08;2&#xff09;sobel算子参数 &#xff08;3&#xff09;X轴方向边缘检测代码演示 1、显示圆的图像 2、x方向上的边缘检测&#xf…

    无人机数据链技术及运行方式详解!

    一、无人机数据链技术要点 1. 通信传输技术 频段选择&#xff1a; 常用频段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同频段在传输距离、带宽和抗干扰性间权衡。 低…

    AI Agent 实战:搭建个人在线旅游助手

    AI Agent 实战&#xff1a;搭建个人在线旅游助手 本次实验中&#xff0c;我们将继续探索 Agent 的提示词&#xff0c;学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…

    检索增强生成(RAG):强化 AI 智能体的知识 “武装”

    技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体&#xff08;Agent&#xff09;第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…

    vscode 打开工程 看不到文件目录

    vscode 打开工程 看不到文件目录 View->Explorer 快捷键&#xff1a;CtrlShiftE

    厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

    在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度&#xff0c;具体应用如下&#xff1a; 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌&#xff08;带宽超500MHz&#xff09;实现高时间分辨率&#xff0c;结合…

    getID3获取本地或远程视频时长

    音频文件也可使用&#xff0c;使用ffmeg安装太复杂了 附ffmpeg方式&#xff1a;centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…

    10、Linux C 网络编程(完整版)

    1、网络发展历史和分层 1.1 Internet 的历史 起源&#xff1a; 1957 年&#xff1a;苏联发射第一颗人造卫星 "Sputnik"。 1958 年&#xff1a;美国总统艾森豪威尔成立 DARPA&#xff08;国防部高级研究计划署&#xff09;。 1968 年&#xff1a;DARPA 提出 "…

    前端:开源软件镜像站 / 清华大学开源软件镜像站 / 阿里云 / 网易 / 搜狐

    一、理解开源软件镜像站 开源软件镜像是指开源软件在远程服务器上的备份副本&#xff0c;允许用户通过互联网快速下载和安装所需的软件。在国内&#xff0c;有多个知名的开源软件镜像站&#xff0c;为开发者提供稳定、快速的开源软件下载服务。 二、常见开源软件镜像站 序号…

    Oracle 数据库中优化 INSERT INTO 操作的性能

    在 Oracle 数据库中优化 INSERT INTO 操作的性能&#xff0c;尤其是在处理大批量数据时&#xff0c;可以通过以下方法显著提升效率。 使用直接路径插入&#xff08;Direct-Path Insert&#xff09; 通过 APPEND 提示绕过缓冲区缓存&#xff0c;直接写入数据文件&#xff0c;减…

    嵌入式硬件篇---嘉立创PCB绘制

    文章目录 前言一、PCB绘制简介1.1绘制步骤1.1.1前期准备1.1.2原理图设计1.1.3原理图转PCB1.1.4PCB布局1.1.5布线1.1.6布线优化和丝印1.1.7制版 1.2原理1.2.1电气连接原理1.2.2信号传输原理1.2.3电源和接地原理 1.3注意事项1.3.1元件封装1.3.2布局规则1.3.3过孔设计1.3.4DRC检查…

    ideal自动生成类图的方法

    在 IntelliJ IDEA 中&#xff0c;“**在项目资源管理器中选择以下类**” 是指通过 **项目资源管理器&#xff08;Project Tool Window&#xff09;** 找到并选中你需要生成类图的类文件&#xff08;如 .java 文件&#xff09;&#xff0c;然后通过右键菜单或快捷键操作生成类图…

    【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件

    考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

    在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS

    在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3&#xff0c;Vite 已经内置了对 SCSS 的支持&#xff0c;通常不需要额外的配置。但是&#xff0c;如果需要自定义配置&#xff0c;可以在路径…