redis事务
说起事务,小伙伴一定会想到传统关系型数据库的事务(要么都成功,要么都失败),redis的事务有些许的不同,我们一起看看
- 是什么:
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞 - 能干什么:
一个队列中,一次性,顺序性,排他性的执行一系列指令。
说人话:开启事务之后,将所有的指令按照顺序存起来,提交的时候一次执行这些指令。
事务常用命令
- multi :标记一个事务块的开始
- discard :取消事务,放弃执行事务块内的所有命令
- exec:执行事务块内命令
- watch:监视一个key或多个key,如果在事务执行之前这些个key被其他命令所改动,那么事务将被打断
- unwatch:取消watch命令对key的监视
事务初体验
-
正常执行(multi exec)
-
放弃事务(multi discard)
以上和传统关系型数据库的事务是有点像的,要么提交,全部命令执行,要么放弃事务,所有命令不提交 -
全体连坐 (开启事物之后,如果其中有 命令 出错,那么都不会成功)
- 冤头债主
所有的指令语法格式全部正确,那就意味着全部加到了queue中,那么其中的incr k1 因为k1不是数字所以执行到这条指令的时候报错,那么就只有这一条指令失败,其他指令成功执行。有异于关系型数据库的事物。
- 冤头债主
watch监控(类似乐观锁)
在multi开启事物之前,将要修改的数据监控上,然后multi,操作数据。如果在事物的过程中没有别的线程操作这个监控的数据,那么exec提交事物的时候是成功的,如果有线程操作了监控的数据,那么exec提交事物就会返回空 失败!(类似乐观锁机制,在提交的时候检查该数据是否被别人动过,如果动过返回失败。)
这里2018-12-07号具体应用的时候小测了一下:
当监控的key自己到时间删除的,提交事务的时候可以提交成功
当监控的key是自己删除的,那么提交事务的时候不能提交成功
spring boot中使用
使用场景是使用 Spring Data Redis 操作redis
Spring Data Redis 是对JRedis的客服端进行很好的封装, Spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,但RedisTemplate先执行调用MULTI方法,然后在执行其它的命令,最后执行EXEC方法时,会出现报错:Caused by:Redis.clents.jedis.exceptions.JedisDataException:ERR EXEC without MULTI 问题
解决办法为:
题后话,由于作者水平有限,文章中难免会有歧义的地方,欢迎大家批评指正,作者定会及时改正