Redis事务

Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台 Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。将Apache Ignite集成到Spring Boot应用中,可以显著提高应用的性能和可扩展性。Spring Boot的简单配置和Ignite的强大功能相结合,使得开发和部署更加高效。首先,创建一个新的Spring Boot项目。可以通过Spring Initializr(https://start.spring.io/) 阅读详情



什么是redis事务

Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令,当调用了EXEC命令将执行所有命令。
Redis中,单条命令是原子性执行的,但Redis事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务常用方法、

multi():开启事务
watch(String... keys):监听key是否被修改,如果在执行exec()前被修改则取消事务
unwatch():取消监听
exec():将事务需要执行的命令发送给Redis执行,并返回结果。返回结果是一个按命令执行顺序返回的list,
discard():取消事务

注意:Redis事务和管道一样,都是异步模式。在事务开启未执行前无法获取到查询操作的结果,必须等待执行exec()后才能获取到结果

小知识点 junit中的@Before、@After注解

@Before:被@After修饰的方法在@Test方法执行前执行

@After:被@After修饰的方法在@Test方法执行后执行

demo测试

测试时的公共方法和Jedis对象

static final Jedis jedis = RedisSimplePool.getJedis();
/**
 * 清空数据库
 */
@Before
public void flushdb() {
	jedis.select(0); //切换数据库
	System.out.println("清空数据库");
	jedis.flushDB();
}

/**
 * 
 * @描述:返还连接
 * @作者:严磊
 * @时间:2020年6月17日 下午10:27:02
 */
@After
public void closeConn() {
	RedisSimplePool.returnJedis(jedis);
}

1、开启事务并提交

/**
 * 
 * @描述:测试开启事务并提交
 * @作者:严磊
 * @时间:2020年6月17日 下午9:10:33
 */
@Test
public void commitTest() {
	
	// 开启事务
	Transaction transaction = jedis.multi();
	
	transaction.set("key-1", "value-1");
	transaction.set("key-2", "value-2");
	transaction.set("key-3", "value-3");
	transaction.set("key-4", "value-4");
	
	// 提交事务
	transaction.exec();
	
	System.out.println(jedis.keys("*"));
}


执行结果:
在transaction.exec();处加入断点。
执行exec方法前,数据库没有数据。
执行exec方法后,数据库插入了4个key。
在这里插入图片描述


2、开启事务然后主动放弃事务

/**
 * 
 * @描述:测试开启事务然后主动放弃事务
 * @作者:严磊
 * @时间:2020年6月17日 下午9:11:30
 */
@Test
public void discardTest() {
	
	// 开启事务
	Transaction transaction = jedis.multi();
	
	transaction.set("key-1", "value-1");
	transaction.set("key-2", "value-2");
	transaction.set("key-3", "value-3");
	transaction.set("key-4", "value-4");
	
	// 放弃事务
	transaction.discard();
	
	System.out.println(jedis.keys("*"));
}


3、使用watch监听指定的键是否被修改,如果在执行exec前被修改则取消事务

/**
 * 
 * @描述:watch 命令会标记一个或多个键,如果事务中被标记的键,在提交事务之前被修改了,那么提交事务,事务就会失败。
 * @作者:严磊
 * @时间:2020年6月17日 下午9:12:25
 * @throws InterruptedException
 */
@Test
public void watchTest() throws InterruptedException {
	//boolean resultValue = transMethod(200);
	boolean resultValue = transMethod(10);
	System.out.println("交易结果(事务执行结果):" + resultValue);
	
	int balance = Integer.parseInt(jedis.get("balance"));
	int debt = Integer.parseInt(jedis.get("expense"));
	
	System.out.printf("balance: %d, expense: %d\n", balance, debt);
}

// 支付操作
public static boolean transMethod(int amtToSubtract) throws InterruptedException {
	int balance;  // 余额
	int expense;  // 已消费额
	
	jedis.set("balance", "100");
	jedis.set("expense", "0");
	
	jedis.watch("balance", "expense");
	
	balance = Integer.parseInt(jedis.get("balance"));
	
	// 余额不足
	if (balance < amtToSubtract) {
		jedis.unwatch();  // 放弃所有被监控的键
		System.out.println("余额不足");
		return false;
	}
	
	Transaction transaction = jedis.multi();
	// 扣钱
	transaction.decrBy("balance", amtToSubtract);
	Thread.sleep(15000);  // 在外部修改 balance 或者 expense
	transaction.incrBy("expense", amtToSubtract);
	
	// list为空说明事务执行失败
	List<Object> list = transaction.exec();
	
	if(list==null)
	{
		return false;
	}
	else
	{
		list.forEach(System.out::println);
		return true;
	}
}

执行结果:
如果在事务执行exec方法前,对key balance或expense进行了修改,exec()方法会返回null。事务中的命令都不会执行。

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds. 在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多` 阅读详情

相关推荐

物理机centos7系统重启后直接进入dracut

Warning: /dev/centos/root does not exist Warning: /dev/mapper/centos-root does not exist 在shell命令行执行以下: dracut:/# lvm vgscan dracut:/# lvm vgchange -ay dracut:/# exit 之后可以正常进入系统(测试正常)。 但是重启之后依然会进入dracut模式,永久解决如下: 查看kernel文件 [root@ecs ~]# ls -ltrh /boot

魏志标的博客 1万+

Jedis源码解析(Transation事务)

1 Redis Client中Transaction如何实现Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示

Kevin.yang专栏 1479

实践指南——【SPSS操作解析】线性混合效应模型在重复测量数据中的应用

本文详细解析了线性混合效应模型在重复测量数据分析中的应用,并提供了SPSS操作指南。文章阐述了该模型如何通过区分固定效应与随机效应,有效处理数据非独立性和缺失值问题,从而获得更可靠的统计推断。

oo7890的博客 550

Jedis源码分析(二)-Jedis的内部实现(Client,Pipeline,Transaction)

Jedis源码分析共有四个章节,以下为各章链接: Jedis源码分析(一)-Jedis介绍 Jedis源码分析(二)-Jedis类结构及实现 Jedis源码分析(三)- JedisCluster类结构及实现 Jedis源码分析(四)-JedisSentinel与ShardedJedis介绍 1 Jedis的类结构 ​ 首先看Jedis的内部结构,图2-1中用橘色框标出了主要支架, 为突出...

liuqinen的博客 663

硬件工程师必备核心知识点

硬件设计是一项系统化工程活动,涉及元器件选型、电源设计、信号完整性、EMC和PCB工艺等多个环节

硬核科技 338

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

Jedis

一、键操作: 二、字符串操作: 三、整数和浮点数操作: 四、列表(List)操作: 五、集合(Set)操作: 六、哈希(Hash)操作: 七、有序集合(Zsort)操作: 八、排序操作: Java 连接 MySql 我们有 mysql-connector ,连接 Redis 我们有 jedis。 九、实例 引入依赖 <dependen...

JinXYan的博客 275

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

一、普通同步方式 二、事务方式(Transactions) 三、管道(Pipelining) 四、管道中调用事务 五、分布式直连同步调用 六、分布式直连异步调用 七、分布式连接池同步调用 八、分布式连接池异步调用 九、需要注意的地方 十、测试 十一...

chuteng3602的博客 354

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

FortiOS 是 Fortinet 公司开发的操作系统,作为 Fortinet 安全平台的核心,提供全面的网络安全功能。 它将网络和安全功能无缝集成,支持跨本地、云、混合和融合 IT/OT/IoT 基础设施环境的统一管理。 FortiOS 7.6 版本引入了生成式人工智能助手、数据保护、托管服务和单一代理等新功能,进一步增强了其安全性和性能。

缘梦未来的博客 1841

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(二)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包exp

慕羽★的博客 1648

redis——事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。 以下是一个事务的例子, 它先以M...

少说,多做。 4501

FreeRTOS全攻略:从入门到精通

本文聚焦 FreeRTOS,从基础概念出发,阐述其开源、轻量级等优势。着重介绍 FreeRTOS 入门知识,涵盖内存管理、任务操作、同步互斥机制等核心内容。其中,空闲任务与钩子函数保障系统基础运行与功能扩展;队列、信号量、互斥锁和事件组等机制,分别从数据传递、资源访问控制、优先级问题解决及多任务同步等方面,为开发者提供高效的任务间协作与资源管理方案,助力开发者掌握 FreeRTOS 核心技术,为嵌入式项目开发筑牢基础。

邓邓子的博客 6357

详解Redis之事务

详解Redis的事务,包括概念,特性,常用命令及使用演示。

. 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Redis】事务

【Redis】事务

m0_72563041的博客 998

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[Redis] Redis事务

🏵️热门专栏:🧊 Java基本语法(97平均质量分)🍕 Collection与数据结构 (92平均质量分)🧀线程与网络(96平均质量分)🍭MySql数据库(93平均质量分)🍬算法(97平均质量分)🍃 Spring(97平均质量分)🎃Redis(97平均质量分)🐰RabbitMQ(97平均质量分)

无需多言 2125

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[Redis][事务]详细讲解

[Redis][事务]详细讲解

SnowK博客 5322

Redis之Redis事务

文章目录一、Redis事务的概念二、Redis事务没有隔离级别的概念三、Redis不保证原子性四、Redis事务的三个阶段五、Redis事务相关命令六、Redis事务使用案例总结 Redis之Redis事务 一、Redis事务的概念 Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命

weixin_37548768的博客 1万+

Redis 事务

Redis 事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。 以下是一个事务的例子...

努力奔跑 2万+

redis的事务

redis通过 multi, exec等命令来实现事务功能,是一种在一个事务内,将事务内的多个请求打包,然后一次性、按顺序地执行多个命令,在事务执行期间,服务器而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

Zj_boring的博客 1776

《Redis》事务

Redis的原子性与事务机制与MySQL有显著差异。Redis事务通过队列实现批量执行命令,不具备回滚机制、隔离性和一致性保证,仅确保命令连续执行。使用MULTI、EXEC、DISCARD等命令管理事务,WATCH命令通过乐观锁机制监控键值变化。Redis事务适用于简单场景如抢票系统,但功能弱于传统数据库事务,无法处理复杂的数据一致性问题,本质上是通过事务队列实现命令的批量执行。

如果需要沟通,可添加微信公众号找我免费答疑 746

【Redis入门到精通八】Redis事务与MySQL事务对比

事务的概念其实就是把一系列操作绑定成一组,让这一组操作能够批量执行,不过在MySQL中有复杂的机制能够保证这一组操作执行并且一定能成功执行,否则就一条也执行不了,但是Redis中的事务就没有这么靠谱,它只负责把操作绑在一起,如果其中有执行失败的操作,事务无法自动回滚。Redis 事务本质上是在服务器上搞了⼀个 "事务队列". 每次客⼾端在事务中进⾏⼀个操作, 都会把命令先发给服务器, 放到 "事务队列" 中(但是并不会立即执行),而是会在真正收到 EXEC 命令之后, 才真正执行队列中的所有操作.

2203_75565612的博客 1110

【redis进阶】Redis 事务

watch 必须搭配事务使用,并且必须在 mutli 之前使用,当执行 watch key 的时候就会给这个 key 安排一个 版本号,版本号可以理解成一个 "整数" 每次在修改的时候,版本号都会 "变大",watch 本质上是给 exec 加了个判定条件,在执行 事务 中命令的时候,此处就会做出判定,判定当前这个 key 的版本号,和最初 watch 的时候记录的版本号 是否 一致!在执行事务的时候,如果某个事务中修改的值,被别的客户端修改了,此时就容易出现数据不一致的问题。

qq_52842680的博客 1029

事务例子_Redis事务系列之一Redis事务详解

一、前言本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容:redis 事务redis乐观锁讲解redis乐观锁实现秒杀我们一步一步来,本章主要讲解事务。二、事务2.1事务阐述讲redis事务之前,我们先来看看事务的定义。事务:一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。但redis的事务不并不是完整意义上的事务,我们称之为弱事务,为什么这么说呢?r...

weixin_42100032的博客 152
上一篇: Redis管道-pipeline
下一篇: mybatis常用知识点笔记
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值