如何关闭redis的自动清理缓存,声明式事务(含有redis)如何解决,redis setnx锁的使用。
20240809
- 一、解决redis数据被删除的方案
- 1、发现问题
- 2、解决
- 注意!!
- 二、声明式事务(当有redis的时候)
- 1. 先看代码
- 2. @Transactional(rollbackFor = Exception.class)
- 3. 如何解决redis在事务里面,如何保证原子性和一致性
- 3.1 我们可以用try catch finally来实现
- 3.2 我们可以让redis的执行放到最后,这样当其他的
- 三、使用分布式锁(redis)
- 1. 先看代码
- 2. 为什么要使用
- 3. 使用的redis的 setnx进行加锁
一、解决redis数据被删除的方案
1、发现问题
在我们小组进行开发的时候,发现,redis中的数据老是会丢失,刚开始以为是若依的SpringBoot配置问题,一直找,但是,没有发现有关的地方。
然后开始看是不是服务器重启,AOF不保存数据的问题,然后发现没有,那就只有一个了!!!那就是redis的config配置了!!
2、解决
- 打开Redis配置文件
- 在Redis服务器上,找到redis.conf文件所在的位置,通常位于Redis安装目录下的/etc/redis/目录中。使用文本编辑器打开该文件。
注释掉相关配置项
在打开的redis.conf文件中,搜索以下两个配置项:
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
修改为
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 0
-
保存对redis.conf文件的修改
-
重启Redis服务器
使用以下命令重启Redis服务器,以使修改后的配置生效:
sudo systemctl restart redis
注意!!
完成以上步骤后,Redis将不再自动进行AOF重写操作,从而关闭了自动清理缓存的功能。
需要注意的是,关闭自动清理缓存可能会导致AOF文件过大而影响性能,因此在实际应用中,需要根据实际情况合理配置AOF重写的触发条件,以及定期手动执行AOF重写操作来清理缓存。
二、声明式事务(当有redis的时候)
1. 先看代码
@Override@Transactional(rollbackFor = Exception.class)public void updateInspectList(List<Sub> subList) {for (Sub sub : subList) {SubVo subVo = new SubVo();SubDTO subDTO = new SubDTO();BeanUtils.copyProperties(sub, subVo);BeanUtils.copyProperties(sub, subDTO);// 更新 term_production_infohomePageCMapper.updateInspectA(subVo);// 更新 om_term_infosubDTO.setDevidqi_state(1);subDTO.setTerm_qi_devid_qi_time(sub.getDevid_qi_time());homePageCMapper.updateInspectB(subDTO);// 将 inspect_list 存入 RedisString term_sn = sub.getTerm_sn();List<Inspect> configList = sub.getInspect_list();for (Inspect inspect : configList) {if(Objects.equals(inspect.getResult(), "ok")){inspect.setResult("1");}else {inspect.setResult("2");}}try {stringRedisTemplate.opsForValue().set("configList:" + term_sn, JSONUtil.toJsonStr(configList));} catch (Exception e) {stringRedisTemplate.delete("configList:" + term_sn);Console.error("Redis创建数据失败", e);throw e;}}}
2. @Transactional(rollbackFor = Exception.class)
声明式事务,根据捕获的异常进行回滚。 Exception.class这是很多异常的父类
@Transactional(rollbackFor = Exception.class)
3. 如何解决redis在事务里面,如何保证原子性和一致性
3.1 我们可以用try catch finally来实现
当遇到错误的时候,我们可以在最后执行到finally来删除我们在这个里面创建的redis或者修改数据回去,从而避免数据不一致或部分更新的情况。。
3.2 我们可以让redis的执行放到最后,这样当其他的
我们也可以直接在最后执行redis,然后对他进行try cath。只有在上面的所有操作都执行完毕之后,才会执行redis,然后对redis的操作进行判断,如果是redis出错了,就只用看抛出的异常然后操作redis。
三、使用分布式锁(redis)
1. 先看代码
@Transactional(rollbackFor = Exception.class)@Overridepublic void Add(AddPageA addPageA) {String lockKey = "lock_key";Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 10, TimeUnit.SECONDS);if (lock != null && lock) {try {OmTermInfoDTO omTermInfoDTO = new OmTermInfoDTO();OutTermShipDTO outTermShipDTO = new OutTermShipDTO();BeanUtil.copyProperties(addPageA, omTermInfoDTO);BeanUtil.copyProperties(addPageA, outTermShipDTO);outTermShipDTO.setBom_no(addPageA.getOut_term_ship_bom_no());omTermInfoDTO.setCreat_time(new Date());/*omTermInfoDTO.setOut_term_ship_ship_time(addPageA.getShip_time());omTermInfoDTO.setOut_term_ship_take_address(addPageA.getTake_address());*/outTermShipDTO.setTake_address(addPageA.getOut_term_ship_take_address());outTermShipDTO.setShip_time(addPageA.getOut_term_ship_ship_time());List<String> regionData = new ArrayList<>();regionData = addPageA.getOut_region_name_no();String term_sn = addPageA.getTerm_sn();stringRedisTemplate.opsForValue().set(term_sn + ":region", JSONUtil.toJsonStr(regionData));// 获取集合List<String> list = addPageA.getOut_region_name_no();// 获取集合的最后一位int lastElement = Integer.parseInt(list.get(list.size() - 1));omTermInfoDTO.setOut_region_id(lastElement);addMapper.AddOmTerInfo(omTermInfoDTO);addMapper.AddOutTerShip(outTermShipDTO);}catch (Exception e){throw new RuntimeException("代码异常");}finally {stringRedisTemplate.delete(lockKey);}}else {throw new RuntimeException("Could not acquire lock");}}
2. 为什么要使用
因为我在一次操作中,连点了好几次,就发现数据和预想不一样,多了一条,所以,针对于这样的操作,就需要进行加锁。
3. 使用的redis的 setnx进行加锁
先定义一个key,然后进来一个线程需要先去获取锁,如果拿到就执行,拿不到就没了,哈哈哈,没有重试啊,因为它不是多线程吧,这个稍后在研究。
最后执行完之后,释放这个锁,下次就能实现了。
String lockKey = "lock_key";Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 10, TimeUnit.SECONDS);if (lock != null && lock) {try{}finally {stringRedisTemplate.delete(lockKey);}}else {throw new RuntimeException("无法拿到锁");}
相关文章:
如何关闭redis的自动清理缓存,声明式事务(含有redis)如何解决,redis setnx锁的使用。
20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意!! 二、声明式事务(当有redis的时候)1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面,如何保证原子性和一致性3…...
C#中抽象类的使用
前言 我们在C#中使用抽象类可以发挥C#多态的功能,把具有共性的方法定义在抽象类中,然后在不同的类中去实现,可增强代码的可读性、扩展性。 1、不使用抽象类 我们定义了下面两个类XiaoWang、XiaoMing,他们有一个Country方法&…...
揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF)
标题:揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF) 在当今数字化时代,网络安全已成为每个开发者和用户必须关注的重点。其中,跨站点请求伪造(CSRF)是一种常见的网络攻…...

【项目实战】C++视频共享点播系统
目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git(如果你的系统尚未安装Git…...

Android逆向题解 攻防世界难度4- Android2.0
Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单,可以直接静态分析。 输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余1,第三段是除3取余等于2࿱…...

P4155 [SCOI2015] 计划
[SCOI2015] 计划 - 洛谷 核心思路 注意到, 可推出, 表示 战士 走 步到达战士位置。 若可以走到且 r < 终点 则答案 然后再加上自己这个哨兵,和走回自己的一个哨兵即可。 AC 代码 #include<bits/stdc.h> using namespace std…...
今日(2024年8月12日)科技新闻
国内: 航空航天领域 我国成功发射卫星互联网高轨卫星。我国试验性冰川保护项目取得积极成效,被形容为“为冰川盖棉被”。2024西太平洋国际航次科考队起航,开启探秘深海海山之旅。我国首架固定翼海上专业搜救航空器正式列编。“祥云”as700载…...
CP AUTOSAR标准之ECUStateManager(AUTOSAR_SWS_ECUStateManager)(更新中……)
1 简介和功能概述 ECU管理器模块(如本文档中所述)是一个基本软件模块(参见[1]),用于管理ECU状态的常见方面。具体来说,ECU管理器模块: 初始化和取消初始化OS、SchM和BswM以及一些基本软件驱动模块。根据请求配置ECU进入休眠和关机状态。管理ECU上的所有唤醒事件ECU管理器模块…...
Java中的中介者模式:解耦复杂系统的有效策略
Java中的中介者模式:解耦复杂系统的有效策略 在软件开发中,随着系统规模的扩大和复杂度的增加,各组件之间的直接交互会导致代码的耦合性增高,从而影响系统的可维护性和可扩展性。为了应对这种复杂性,中介者模式&#…...

transformer(李宏毅老师系列)
自学参考: Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq:输入一个序列的向量作为input,output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…...

XCode15.4真机运行调试
更新Xcode后,没有模拟器内容,而且真机也不显示,编译按钮无法点击,设备在管理运行目标中可见,但无法选中解决方案:下载iOS17.5模拟器,但最坑的是直接点击“Get”下载总是中断,且无法断…...

Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)
文章目录 环境的配置方法1:从源代码构建第一步:克隆库的源代码第二步:构建库 方法 2:使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…...

shell外壳与Linux权限
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…...
越混越好的项目经理做对了哪些事?现在知道还不晚
作为一名项目经理,你最害怕的是什么? 是做不完的项目?延迟的进度条?还是团队人心涣散? 很多人都知道,得人心者得天下,一个成功的领导者,一定是能做到让人心服口服的。如果失去了团…...

haproxy是什么?以及haproxy基础实验
目录 一、什么是负载均衡? 二、为什么要用haproxy? 三、haproxy的基本部署实验: 3.1 基本配置实验 环境准备: 详细步骤: 3.2 haproxy-多进程与多线程实验: 多进程: 多线程:…...

【向量数据库】向量数据库的构建和检索
1、使用 sentence-transformers 将文本编码为向量 安装 sentence-transformers: pip install -U sentence-transformers在 huggingface 下载 all-MiniLM-L6-v2 模型权重(1_Pooling 是文件夹,里面包含一个 config.json 文件)&…...

Mysql基础篇之DQL语言
Mysql基础篇之DQL语言 1. 基础查询特点语法格式闲言碎语 2. 条件查询语法格式条件表达式逻辑表达式模糊查询 3. 排序查询4. 常见函数单行函数1. 字符函数2. 数学函数3. 日期函数4. 流程控制函数5. 其他函数 分组函数 5. 分组查询分组函数语法格式特点 6. 多表连接查询分类SQL 七…...
python async
要使用 Python 的 async 特性编写一个代码,以交替使用两个 AI API 处理数据,您可以按照以下步骤进行。假设这两个 AI API 的调用是异步的,并且我们需要在两个 API 之间轮流处理一组数据。 import asyncio import aiohttp async def call_ap…...

利用QT和FFmpeg实现一个简单的视频播放器
在当今的多媒体世界中,视频播放已成为不可或缺的一部分。从简单的媒体播放器到复杂的视频编辑软件,视频解码和显示技术无处不在。本示例使用Qt和FFmpeg构建一个简单的视频播放器。利用ffmpeg解码视频,通过QWidget渲染解码后的图像,…...

怎么用云手机进行TikTok矩阵运营
TikTok作为炙手可热的社交媒体巨头,已经吸引了亿万用户的目光。随着科技的飞速发展,云手机的出现为TikTok矩阵运营注入了新的活力。本文将深入探讨云手机在TikTok矩阵运营中的实际应用,并分享一系列高效策略与技巧。 (1࿰…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...