Redis事务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis事务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3102字,纯文字阅读大概需要5分钟。
内容图文
Redis的原子性有两点:
1.单个操作的原子性
2.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
原子操作的意思就是要么成功执行要么失败完全不执行。用现实中的转账比喻最形象,你转账要么成功,要么失败钱不动,不存在你钱转出去了,但收款方没收到这种成功一半失败一半的情况。
在Redis中,MULTI、EXEC、DISCARD、WATCH四个指令构成了Redis事务处理的基础:
1.MULTI:用来组装一个事务;
2.EXEC:用来执行一个事务;
3.DISCARD:用来取消一个事务;
4.WATCH:用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
举例如下:
redis> MULTI //标记事务开始
OK
redis> INCR user_id //多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC //执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
在上面的例子中,我们看到了QUEUED字样,这表示我们在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行;
对于事务的执行来说,如果Redis开启了AOF持久化,那么一旦事务被成功执行,事务中的命令就会通过write命令一次性写到磁盘中去,如果在向磁盘中写的过程中恰好出现断点、硬件故障等问题,那么就可能出现只有部分命令进行了AOF持久化,这时AOF文件就会出现不完整的情况,这时,我们就可以使用redis-check-aof工具来修复这一问题,这个工具会将AOF文件中不完整的信息移除,确保AOF文件完整可用。
有关事务,大家经常遇到两类错误:
1.调用EXEC之前的错误;
2.调用EXEC之后的错误。
对于“调用EXEC之前的错误”,有可能是由于语法错误导致的,也有可能是由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,Redis都会进行记录,在客户端调用EXEC时,Redis会拒绝执行这一事务(这是2.6.5版本之后的策略,在2.6.5之前的版本中,Redis会忽略那些入队失败的命令,只执行那些入队成功的命令),示例如下:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> haha //一个明显错误的指令
(error) ERR unknown command 'haha'
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
//redis无情地拒绝了事务的执行,原因是“之前出现了错误”
(error) EXECABORT Transaction discarded because of previous errors.
而对于“调用EXEC之后的错误”,Redis则采用了完全不同的策略,即Redis不会理睬这些错误,而是继续向下执行事务中的其它命令。这是因为,对于应用层面的错误,并不是Redis自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来其它命令的执行,示例如下:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 23
QUEUED
//age不是集合,所以如下是一条明显错误的指令
127.0.0.1:6379> sadd age 15
QUEUED
127.0.0.1:6379> set age 29
QUEUED
127.0.0.1:6379> exec //执行事务时,redis不会理睬第2条指令执行错误
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get age
"29" //可以看出第3条指令被成功执行了
WATCH指令,可以帮我们实现类似于“乐观锁”的效果,即CAS。WATCH本身的作用是“监视key是否被改动过”,而且支持同时监视多个key,只要还没真正触发事务,WATCH都会尽职尽责地监视,一旦发现某个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发,示例如下:
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> watch age //开始监视age
OK
127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec //触发EXEC
(nil) //事务无法被执行
内容总结
以上是互联网集市为您收集整理的Redis事务全部内容,希望文章能够帮你解决Redis事务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。