Redis事务

自带的Multi事务

垃圾

由MULTI, EXEC, DISCARD and WATCH这四个命令配合完成的。

MULTI

即开启事务 然后一条一条的写业务代码 都会塞进Redis队列里面

EXEC

结束并开始按队列顺序执行事务

DISCARD

就是在EXEC取消事务

WATCH

watch用来提前来观察数据,具体来说,它用于监视一个(或多个) key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。

所以watch命令可以决定事务是执行还是回滚,一般的操作是 :在multi命令之前使用watch命令监控某些键值对,然后使用multi命令开启事务,执行各类对数据结构进行操作的命令,这些命令会进入先入先出队列中。当redis使用exec命令执行事务的时候,首先会比较对被watch的键值对有没有发生变化,如果产生变化回滚事务,而没有变化执行事务中的命令,

无论事务执行与否,最终都会取消执行事务之前的watch命令。

Multi事务具备原子性吗?

不具备,只是通过单线程的特性,让其它操作切不进来。

但是中途如果因为崩溃,或者自己有问题,还是可能只做了一半。

Multi事务的一些问题

1.事务开启后,每个命令其实都是一次调用, 浪费资源;

2.因为这些命令执行之间是有时间的,还需要Watch提前来观察,这也太难用了

3.通常来说失败了会中断后续流程,而Multi失败会继续,

LUA!

Redis是2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为EVAL.

Redis因为是单线程操作,处理过程中,是不会被被打断并切换到其它处理,所以Redis执行Lua,不出异常的情况下,也不会被打断。

操作方法

EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

相比于原生的Multi

●可以编写if else这种选择逻辑

●事务中间如果失败,会中断后续执行

●使用方便,开启Lua就可以执行事务,不像Muti还需要Watch来保证执行开始时状态未改变

相关推荐
秋深枫叶红几秒前
嵌入式第三十四篇——linux系统编程——进程
linux·服务器·数据库·学习
hgz0710几秒前
Spring Boot Starter机制
java·spring boot·后端
daxiang120922052 分钟前
Spring boot服务启动报错 java.lang.StackOverflowError 原因分析
java·spring boot·后端
我家领养了个白胖胖2 分钟前
极简集成大模型!Spring AI Alibaba ChatClient 快速上手指南
java·后端·ai编程
jiayong233 分钟前
Markdown编辑完全指南
java·编辑器
贡献者手册12 分钟前
SQLite 的进阶版,面向边缘计算、嵌入式场景的高性能本地数据库【Turso Database】
数据库
heartbeat..21 分钟前
深入理解 Redisson:分布式锁原理、特性与生产级应用(Java 版)
java·分布式·线程·redisson·
一代明君Kevin学长23 分钟前
快速自定义一个带进度监控的文件资源类
java·前端·后端·python·文件上传·文件服务·文件流
未来之窗软件服务26 分钟前
幽冥大陆(四十九)PHP打造Java的Jar实践——东方仙盟筑基期
java·php·jar·仙盟创梦ide·东方仙盟·东方仙盟sdk·东方仙盟一体化
TH_129 分钟前
6、前台界面传递老数据,导致业务数据错误
数据库