当前位置:网站首页>Redis的事务机制
Redis的事务机制
2022-06-29 13:39:00 【全栈程序员站长】
一、Redis事务的相关命令:
1、MULTI:
用于标记事务块的开启。MULTI执行之后,Redis会将后续的命令逐个放到一个缓存队列中,当EXEC命令被调用时,所有队列中的命令才会被原子化执行。
2、EXEC:
在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令。
3、DISCARD:
放弃事务,清除事务队列中的命令,然后恢复正常的连接状态。如果使用了UNWATCH命令,那么DISCARD命令就会取消当前连接监控的所有键。
4、WATCH:
当某个事务需要按条件执行时,就要使用该命令将key设置为受监控的。如果在事务执行之前这些key被其他命令所改动,那么整个事务将会被打断。WATCH命令可用于提供CAS功能。
5、UNWATCH:
清除事务中所有监控的键。如果调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。
二、Redis事务原理:
1、事务的定义:
Redis的事务本质是一组命令的集合,一个事务中的命令要么全部执行,要么都不执行。事务的原理是先将属于一个事务的命令发送给Redis,存放到一个队列中,再让Redis依次执行这些命令。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。
除此之外,Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入。也就是说,在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,即不会被其它命令插入,不许加塞,等事务中的所有命令都执行完毕才去处理其他客户端的命令请求。即一次性、顺序性、排他性的执行一系列命令。
2、Redis事务的特性:
(3)原子性:Redis的原子性只能保证批量操作的一次性执行,和传统mysql事务不同的是,Redis不支持回滚,在执行EXEC命令时,如果Redis事务中某条命令执行失败,其后的命令仍然会被执行,没有回滚。
Redis为什么不支持回滚rollback?
- Redis 操作失败的原因只可能是语法错误或者错误的数据类型操作,这些都是在开发期间能发现的问题,不会进入到生产环境,因此不需要回滚。
- Redis 内部设计推崇简单和高性能,支持事务回滚能力会导致设计复杂,这与Redis的初衷相违背,因此不需要回滚能力。
- Redis 的应用场景明显不是为了数据存储的高可靠与强一致性而设计的,而是为了数据访问的高性能而设计,设计者为了简单性和高性能而部分放弃了原子性。
(2)隔离性:事务是一个单独的隔离操作,没有隔离级别的概念,事务队列中的命令在没有提交之前都不会实际的被执行。在事务中,所有命令都会被序列化,按顺序地执行。事务在执行的过程中,其他客户端发送来的命令请求不会插入到事务执行命令序列中。
(3)持久性:如果Redis运行在某种特定的持久化模式下时,事务也具有持久性。
3、Redis事务的错误处理:
如果一个事务中的某个命令执行出错,Redis会怎样处理呢?要回答这个问题,首先需要知道什么原因会导致命令执行出错。
(1)语法错误:
语法错误指命令不存在或者命令参数的个数不对。比如:
redis>MULTI
OK
redis>SET key value
QUEUED
redis>SET key
(error)ERR wrong number of arguments for 'set' command
redis> errorCOMMAND key
(error) ERR unknown command 'errorCOMMAND'
redis> EXEC
(error) EXECABORT Transaction discarded because of previous errors.跟在MULTI命令后执行了3个命令:一个是正确的命令,成功地加入事务队列;其余两个命令都有语法错误。而只要有一个命令有语法错误,执行EXEC命令后Redis就会直接返回错误,连语法正确的命令也不会执行。
这里需要注意一点: Redis 2.6.5之前的版本会忽略有语法错误的命令,然后执行事务中其他语法正确的命令。就此例而言,SET key value会被执行,EXEC命令会返回一个结果:1) OK。
(2)运行错误:
运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键,这种错误在实际执行之前Redis是无法发现的,所以在事务里这样的命令是会被Redis接受并执行的。如果事务里的一条命令出现了运行错误,事务里其他的命令依然会继续执行(包括出错命令之后的命令),示例如下:
redis>MULTI
OK
redis>SET key 1
QUEUED
redis>SADD key 2
QUEUED
redis>SET key 3
QUEUED
redis>EXEC
1) OK
2) (error) ERR Operation against a key holding the wrong kind of value
3) OK
redis>GET key
"3"可见虽然SADD key 2出现了错误,但是SET key 3依然执行了。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100029.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢

Uncover the practice of Baidu intelligent test in the field of automatic test execution

Online text filter less than specified length tool

直觉与实现:Batch Normalization

By proxy, by buyout, the wild era of domestic end-to-end travel is waiting for the next "eternal robbery"

灵感收集·创意写作软件评测:Flomo、Obsidian Memo、Napkin、FlowUs

在线文本过滤小于指定长度工具

Wechat applet: install B artifact and P diagram, modify wechat traffic main applet source code, Download funny joke diagram, make server free domain name

疯狂的数字藏品,下一个造富神话?

【毕业季·进击的技术er】1076万毕业生,史上最难就业季?卷又卷不过,躺又躺不平,敢问路在何方?

文物数字藏品,开启文化传承的新方式
随机推荐
常用postgresql数据操作备忘:时间
人不成熟的特征
Appkey when applying for offline packaging of uniapp
灵感收集·创意写作软件评测:Flomo、Obsidian Memo、Napkin、FlowUs
微信小程序:装B神器P图修改微信流量主小程序源码下载趣味恶搞图制作免服务器域名
I talked about exception handling for more than half an hour during the interview yesterday
Problems in replacing RESNET convolution of mmdet with ghost convolution group
Application of ansvc reactive power compensation device in a shopping mall in Hebei
Hash hash game system development explanation technology -- hash game system development solution analysis
Distributed cache for memcached
Grep exact match
留给比亚迪的时间还有三年
golang代码规范整理
numpy数组创建
逆向调试入门-PE文件节表与区块03/07
unity吃豆人小游戏,迷宫实现
微信小程序:大红喜庆版UI猜灯谜又叫猜字谜
硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件
[use of veux developer tools - use of getters]
c语言入门教程–-6循环语句