Spring Data Redis 二:RedisTemplate实现事物问题剖析和解决

Android车载桌面开发实战:从CarLauncher源码解析到自定义Launcher开发(Android 11) 本文深入解析了Android 11中CarLauncher的源码架构与核心模块,并提供了从零开始定制开发车载Launcher的完整实战指南。内容涵盖车载桌面的独特定位、驾驶场景优化、多屏协同、动态内容嵌入等核心挑战,以及如何构建符合安全规范、体验流畅的自定义车载桌面应用,是车载应用开发者提升系统级定制能力的实用参考。 阅读详情
Spring Data Redis 二:RedisTemplate实现事物问题剖析和解决

一、问题描述

     Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MULTI命令之后,执行所有的命令都不会执行,会先放到一个队列中,会提示正在Query,当最后执行EXEC命令之后,Redis会按照之前的进入队列的顺序,执行命令。

      Spring Data Redis 是对JRedis的客服端进行很好的封装, Spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,但RedisTemplate先执行调用MULTI方法,然后在执行其它的命令,最后执行EXEC方法时,会出现报错:Caused by:Redis.clents.jedis.exceptions.JedisDataException:ERR EXEC without MULTI问题。


二、原因分析

     Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,我们需要重新添加数据,对原先的数据进行删除,在多个线程情况下数据会丢失,所以我们需要事务完成相应的效果。

      Spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,远看可以解决问题时,代码实现:

     

[java] view plain copy
  1. stringRedisTemplate.multi();  
  2. stringRedisTemplate.delete("test");  
  3. stringRedisTemplate.opsForValue().set("test","2");  
  4. stringRedisTemplate.exec();  

       结果保 错误:

         

       

            我们查询multi、delete等源代码,发现会执行RedisTemplate类中execute()方法进行跟踪发现 RedisCallback中doInRedis获取的RedisConnection每次都是新的,所以才导致该问题。

        分析Redis源代码:

               我们查看multi实现

                 
                                
                    跟踪发现RedisConnection conn每次都是新的,导致出现那个错误

三、解决方案

       只能自己实现RedisCallBack底层,采用RedisTemplate的SesionCallback来完成在同一个Connection中,完成多个操作的方法:

             

[java] view plain copy
  1. SessionCallback<Object>   sessionCallback=new SessionCallback<Object>(){  
  2.   @Override  
  3.    public Object execute(RedisOperations operations) throws DataAccessException{  
  4. operations.multi();  
  5. operations.delete("test");  
  6. operations.opsForValue.set("test","2");  
  7. Object val=operations.exec();  
  8. return val;  
  9. }  
  10. }  
  11. StringRedisTemplate.execute(sessionCallback);  


四、测试结果

     

          模拟多个线程调用,我采用了3个线程进行模拟测试:

线程3=================获取key:test值为:1

线程2=================获取key:test值为:1

线程1=================获取key:test值为:1

线程3=================获取key:test值为:1

线程2=================获取key:test值为:1

线程3=================获取key:test值为:1

线程1=================获取key:test值为:2

线程2=================获取key:test值为:2

【Linux系统】Kdenlive软件多机位同音频视频同步化处理 Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用和调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视. 阅读详情

相关推荐

科研笔记:怎样写好博士论文?

博士论文外审避坑指南与写作要点 博士论文外审的核心关注点呈现5级优先级:科研成果(硬指标)>创新性>逻辑结构与场景合理性>文献综述与规范性>工作量验证。外审专家会重点核查:1)成果清单是否达标;2)创新点是否真实明确;3)章节逻辑是否自洽、应用场景是否细化;4)文献综述是否构建"研究坐标系";5)实验/理论支撑是否充分。需特别注意三大雷区:科学错误(直接挂稿)、伪创新、场景不合理。写作时应强化选题依据的场景细化,通过"发展阶段+跨领域对比"提升文献综述质量。

Grow into a more wonderful you 1064

RedisTemplate实现Redis事务

今天遇到需求要统计每次执行成功的个数和失败的个数,但是项目部署的是多实例的而且每个实例还是多线程的。 只使用多线程的计数器,没有很好的方法去实现多实例的数据汇总,想到使用redis或者mysql,由于是多线程的对统计字段变化频繁所以果断放弃mysql选择redis, 之前使用mysql遇到过多线程情况下数据出现ABA问题,所以在选择redis的时候不能只是单纯的更新数据,还要考虑多线程情况下数据的同步问题。 同时参考了:https://my.oschina.net/sxwailyc/blog/1973427

bin929的博客 2011

告别Win11睡眠假死:深入解析Modern Standby S0与S3冲突及注册表修复方案

本文深入解析了Windows 11中Modern Standby(S0)与传统睡眠(S3)模式的冲突,该冲突是导致电脑睡眠后出现假死、断网等问题的根源。文章提供了通过修改注册表键值(PlatformAoAcOverride)强制启用稳定S3睡眠的终极修复方案,并附有详细诊断步骤与避坑指南,帮助用户彻底解决睡眠故障。

ol789012的博客 823

Redis--事务

1 Redis中使用MULTI命令开启一个事务,客户端可以向服务器端发送多条命令,但是不会立即执行,而是进入一个队列中,只有当执行EXEC时,队列中所有的命令才会去执行。可以通过DISCARD命令清空事务队列。&amp;gt; MULTI OK &amp;gt; INCR foo QUEUED &amp;gt; INCR bar QUEUED &amp;gt; EXEC 1) (integer) 1 2) (integer) 12 问题:在执行exec之

BtWangZhi的博客 890

强化学习赋能宇树机器狗:Isaac Gym与MuJoCo仿真训练全解析

本文详细解析了如何利用Isaac Gym和MuJoCo两大仿真平台为宇树机器狗构建强化学习训练管道。内容涵盖环境配置、模型导入、PPO算法框架设计、奖励函数构建以及从仿真到实机的策略迁移技巧,为开发者提供了一套完整的宇树狗仿真训练实践方案。

zeta9的博客 620

帕德伯恩大学轴承数据集(PU)介绍

PU数据集介绍一、帕德伯恩大学轴承数据集故障类别说明二、关于损伤描述2.1 损伤组合:2.2 重复和多重损伤的安排:2.3 几何尺寸2.4 损伤程度2.5损伤特征数据集损伤类别三、人为损坏轴承3.1 最常用的人为损伤制造方法是:3.2 本数据集使用的人工损坏是由三种不同方法引起的四、通过加速寿命试验产生真正的轴承损坏样本 一、帕德伯恩大学轴承数据集 数据集下载地址 从帕德伯恩大学获得的PU数据集是一个6203轴承数据集,包括人为诱发的和真实的损害。采用压电加速度计采集轴承座的振动信号,采样频率为64 kHz

m0_47180208的博客 3万+

【Redis】RedisTemplate事物操作

Redis对事务的支持很简单,当一个客户端连接Redis服务时,发出MULTI命令就行进入事务,在执行MULTI命令之后,所要执行的命令并不会执行,而是进入到一个队列中,当最后执行EXEC命令后,才会执行对redis的操作命令,DISCATD为回滚事务。 RedisTemplate提供了MULTI、EXEC、DISCATD命令的封装,代码如下: redisTemplate.setEnableTransactionSupport(true); redisTemplate.m...

niuchenliang524的博客 6642

Vue3 + MQTT.js 实现 SCADA 实时数据通信:从不稳定到稳定的完整实践

本文介绍了SCADA组态引擎开发中MQTT协议的应用及优化实践。项目采用MQTT协议实现工业设备数据采集与可视化,但面临连接不稳定、数据格式多样化和数据绑定复杂三大问题。针对MQTT连接问题,分析发现超时设置过短(原8秒)、缺少客户端超时配置和心跳机制是主要原因。优化方案包括:协议转换(mqtt://→ws://)、双重超时保护(15秒手动+30秒客户端)、60秒心跳间隔等,显著提升了连接稳定性。通过完整代码实现展示了连接配置、认证处理和错误处理机制,为物联网数据传输提供了可靠解决方案。

weixin_36794508的博客 1398

SpringBoot项目中使用Redis事务出现ERR EXEC without MULTI的分析与总结

一、场景 虚拟机CentOS7 redis版本6.2.6 SpringBoot版本2.5.6 spring-boot-starter-data-redis依赖版本2.4.0 RedisTemplate配置 package com.example.redistest.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAc

Luffy的博客 4575

基因家族的鉴定-基于Windows系统上的HMMER

基因家族的鉴定-基于Windows系统上的HMMER。

liangjinghui123的博客 3248

【WRF-Chem工具】pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

WW、forever的博客 210

RedisTemplate实现事物问题剖析和解决

一、问题描述     Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MULTI命令之后,执行所有的命令都不会执行,会先放到一个队列中,会提示正在Query,当最后执行EXEC命令之后,Redis会按照之前的进入队列的顺序,执行命令。      Spring Dat...

风 1912

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9194

Spring Data Redis的setEnableTransactionSupport方法引发的问题

Spring Data Redis的`setEnableTransactionSupport`方法引发的问题

流水账 299

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RedisTemplate实现事物问题剖析和解决[转]

一、问题描述 Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MULTI命令之后,执行所有的命令都不会执行,会先放到一个队列中,会提示正在Query,当最后执行EXEC命令之后,Redis会按照之前的进入队列的顺序,执行命令。 Spri...

weixin_30657541的博客 97

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringBoot(spring-data-redis)对事物的支持

官文:https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:template虽然RedisTemplate提供了multi/exec/discard方法,但是按照理解的方式直接在代码前后调用multi和exec会抛出异常(ERR EXEC without MULTI). 下面说一下官方调用姿...

t0m的专栏 1924

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

一、概念简介: Redis:   Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis,走了不少弯路,所以总结一条我认为不错...

weixin_34306676的博客 105

java、spring连接redis

java集成Redis 依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0</version> </dependency> // 创建一个 Jedis 的连接 Jedis jedis = new Jedis(“127.0.0.1”, 6379); /

qq_43536051的博客 730

Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)

SpringDataRedis调用Redis底层解读 在SpringBoot2.X之前还是直接使用的官方推荐的Jedis连接的Redis 在2.X之后换为了lettuce Jedis:采用直接连接,多线程操作不安全,如果想要避免不安全,使用Jedis pool连接池;BIO lettuce:底层采用Netty,实例可以在多个线程之间共享,不存在线程不安全的情况,可以减少线程数量;NIO...

彼岸舞的博客 293

springboot 整合Redis

0、导入 maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-redis&lt;/artifactId&gt;&lt;/dependency&gt; 1、SDR说明Spring Data Redis...

weixin_33695082的博客 127

利用redis分布式锁 setnx 解决雪崩、穿透、击穿

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33720956的博客 466

redis+springboot

Jedis 是直连模式,在多个线程间共享⼀个 Jedis 实例时是线程不安全的,需要使⽤连接池 其API提供了⽐较全⾯的Redis命令的⽀持,相⽐于其他Redis 封装框架更加原⽣Jedis中的⽅法调⽤是⽐较底层的暴露的Redis的API,Java⽅法基本和Redis的API保持着⼀致使⽤阻塞的I/O,⽅法调⽤同步,程序流需要等到socket处理完I/O才能执⾏,不⽀持异步操作。 lettuce:⾼级Redis客户端,⽤于线程安全同步,异步响应基于Netty的的事件驱动,可以在多个线程间并发访问,通过异步

weixin_45063957的博客 215

SpringBoot操作Redis事务方法

SpringBoot操作Redis事务方法。

qq_42946963的博客 455

2021-08-20

redis学习整理,redis客户端到jedis代码交互,到sring家族提供的redisTemplate(springRedisTemplate区别)在到redission分布式锁 详细命令参考redis菜鸟教程 https://www.runoob.com/redis/strings-setnx.html reids优点 reids是一款非关系型数据库(nosql),数据储存在缓存之中,储存格式key,value,可以储存基础数据类型以及对象或者集合等各种格式,数据库只支持基础类型。 reids缺点

weixin_45650629的博客 113

redis 详细

转载详细http://www.cnblogs.com/songanwei/p/9274348.html 原文https://www.jianshu.com/p/7bf5dc61ca06 RedisTemplate之opsForValue使用说明https://blog.youkuaiyun.com/qq_25135655/article/details/80357137#commentBox ...

weixin_42900551的博客 195
上一篇: spring 事件(Application Event)
下一篇: JAVA回调机制(CallBack)详解
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值