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来保证执行开始时状态未改变

相关推荐
橙露3 分钟前
排序算法可视化:用 Java 实现冒泡、快排与归并排序的对比分析
java·python·排序算法
靠沿5 分钟前
【优选算法】专题二——滑动窗口
java·数据结构·算法
TDengine (老段)10 分钟前
TDengine IDMP 基本概念
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
老邓计算机毕设14 分钟前
SSM医疗门诊管理系统3g2z7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 项目·医疗门诊管理系统
鸡蛋豆腐仙子15 分钟前
redis及实现分布式锁的原理
java·redis·分布式·学习·缓存
好家伙VCC17 分钟前
# 发散创新:基于Solidity的DeFi协议设计与实现——从原理到实战代码解析在区块链世界中,**DeFi(去中心化金
java·python·去中心化·区块链
H Corey18 分钟前
Java字符串操作全解析
java·开发语言·学习·intellij-idea
Aric_Jones19 分钟前
博客音乐播放器实现全解析
java·运维·数据库·人工智能·docker·容器·eclipse
2501_9419820523 分钟前
Python开发:实现企微外部群消息关键词监控
java·服务器·数据库
brucelee18625 分钟前
Java 开发AWS Lambda 实战指南(SAM CLI + IntelliJ)
java·开发语言