Redis事务
-
Redis中事务可以一次执行多个命令,是一组命令的集合,一个事务中的命令都会被序列化,在事务的执行过程中,会按照顺序串行化执行队列中的命令。
-
Redis是一次性,顺序性,排他性的执行一个队列中的一系列命令 Redis不保证原子性
-
Redis中,单条命令的执行是原子性,但事务是不保证原子性,而且没有回滚的换概念, 事务中任意的命令执行失败,其他的命令是可以执行的
-
Redis中的事务是没有隔离级别的
事务命令
事物的执行过程分为三个步骤:开始事务:multi ———>命令入队————>执行事务exec
所有的命令的事务中,并没有直接执行,只有发起执行事务的命令时才会正常执行
正常的执行命令
放弃事务
discard:放弃事务队列运行
编译时异常
如果命令错误,即编译时异常,事务中的所有命令都不会被执行
执行时异常
执行时异常,如果队列中存在错误的语法,执行命令的时候,其他的命令可以正常执行,错误的命令抛出异常
watch
监视一个或者多个key,如果事务在执行之前这个key被其他的命令改动,那么事务会被打断
可以当做乐观锁使用
使用watch当做乐观锁使用
使用watch监视Money,在窗口1监视money,并开始事务,在窗口2上对事务做了修改,在窗口1执行事务时会执行失败
窗口2执行命令
窗口1执行命令:
扩展:
Redis为啥不支持回滚?
如果你具备关系型数据库的知识背景,你就会发现一个事实:在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪,然而,这种行为也有合理之处:只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。
Jedis
在java体系中,有三种常见的Redis客户端:Jedis、Redission和lettuce
- Jedis:其提供API是和Redis命令相比是比较全面,Jedis中java方法基本和Redis提供的命令保持一致,调用的是比较底层的Redis的命令
- Redisson:实现分布式和可扩展性的java的数据结构,分布式锁、分布式集合、和jedis相