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

如何关闭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、解决

  1. 打开Redis配置文件
  2. 在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
  1. 保存对redis.conf文件的修改

  2. 重启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、解决注意&#xff01;&#xff01; 二、声明式事务&#xff08;当有redis的时候&#xff09;1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面&#xff0c;如何保证原子性和一致性3…...

C#中抽象类的使用

前言 我们在C#中使用抽象类可以发挥C#多态的功能&#xff0c;把具有共性的方法定义在抽象类中&#xff0c;然后在不同的类中去实现&#xff0c;可增强代码的可读性、扩展性。 1、不使用抽象类 我们定义了下面两个类XiaoWang、XiaoMing&#xff0c;他们有一个Country方法&…...

揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF)

标题&#xff1a;揭秘网络攻击&#xff1a;深入理解JavaScript中的跨站点请求伪造&#xff08;CSRF&#xff09; 在当今数字化时代&#xff0c;网络安全已成为每个开发者和用户必须关注的重点。其中&#xff0c;跨站点请求伪造&#xff08;CSRF&#xff09;是一种常见的网络攻…...

【项目实战】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&#xff08;如果你的系统尚未安装Git&#xf…...

Android逆向题解 攻防世界难度4- Android2.0

Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单&#xff0c;可以直接静态分析。 输出字符串也就是flag 长度是15&#xff0c;然后分成三段&#xff0c;第一段是可以整除3&#xff0c;第二段是除3取余1&#xff0c;第三段是除3取余等于2&#xff1…...

P4155 [SCOI2015] 计划

[SCOI2015] 计划 - 洛谷 核心思路 注意到&#xff0c; 可推出&#xff0c; 表示 战士 走 步到达战士位置。 若可以走到且 r < 终点 则答案 然后再加上自己这个哨兵&#xff0c;和走回自己的一个哨兵即可。 AC 代码 #include<bits/stdc.h> using namespace std…...

今日(2024年8月12日)科技新闻

国内&#xff1a; 航空航天领域 我国成功发射卫星互联网高轨卫星。我国试验性冰川保护项目取得积极成效&#xff0c;被形容为“为冰川盖棉被”。2024西太平洋国际航次科考队起航&#xff0c;开启探秘深海海山之旅。我国首架固定翼海上专业搜救航空器正式列编。“祥云”as700载…...

CP AUTOSAR标准之ECUStateManager(AUTOSAR_SWS_ECUStateManager)(更新中……)

1 简介和功能概述 ECU管理器模块(如本文档中所述)是一个基本软件模块(参见[1]),用于管理ECU状态的常见方面。具体来说,ECU管理器模块: 初始化和取消初始化OS、SchM和BswM以及一些基本软件驱动模块。根据请求配置ECU进入休眠和关机状态。管理ECU上的所有唤醒事件ECU管理器模块…...

Java中的中介者模式:解耦复杂系统的有效策略

Java中的中介者模式&#xff1a;解耦复杂系统的有效策略 在软件开发中&#xff0c;随着系统规模的扩大和复杂度的增加&#xff0c;各组件之间的直接交互会导致代码的耦合性增高&#xff0c;从而影响系统的可维护性和可扩展性。为了应对这种复杂性&#xff0c;中介者模式&#…...

transformer(李宏毅老师系列)

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

XCode15.4真机运行调试

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

Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)

文章目录 环境的配置方法1&#xff1a;从源代码构建第一步&#xff1a;克隆库的源代码第二步&#xff1a;构建库 方法 2&#xff1a;使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…...

shell外壳与Linux权限

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…...

越混越好的项目经理做对了哪些事?现在知道还不晚

作为一名项目经理&#xff0c;你最害怕的是什么&#xff1f; 是做不完的项目&#xff1f;延迟的进度条&#xff1f;还是团队人心涣散&#xff1f; 很多人都知道&#xff0c;得人心者得天下&#xff0c;一个成功的领导者&#xff0c;一定是能做到让人心服口服的。如果失去了团…...

haproxy是什么?以及haproxy基础实验

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

【向量数据库】向量数据库的构建和检索

1、使用 sentence-transformers 将文本编码为向量 安装 sentence-transformers&#xff1a; pip install -U sentence-transformers在 huggingface 下载 all-MiniLM-L6-v2 模型权重&#xff08;1_Pooling 是文件夹&#xff0c;里面包含一个 config.json 文件&#xff09;&…...

Mysql基础篇之DQL语言

Mysql基础篇之DQL语言 1. 基础查询特点语法格式闲言碎语 2. 条件查询语法格式条件表达式逻辑表达式模糊查询 3. 排序查询4. 常见函数单行函数1. 字符函数2. 数学函数3. 日期函数4. 流程控制函数5. 其他函数 分组函数 5. 分组查询分组函数语法格式特点 6. 多表连接查询分类SQL 七…...

python async

要使用 Python 的 async 特性编写一个代码&#xff0c;以交替使用两个 AI API 处理数据&#xff0c;您可以按照以下步骤进行。假设这两个 AI API 的调用是异步的&#xff0c;并且我们需要在两个 API 之间轮流处理一组数据。 import asyncio import aiohttp async def call_ap…...

利用QT和FFmpeg实现一个简单的视频播放器

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

怎么用云手机进行TikTok矩阵运营

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

Docker 离线安装指南

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

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

ios苹果系统,js 滑动屏幕、锚定无效

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

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...