接下来,我们来学习一下redis中的事务。
Redis支持事务?不应该叭,redis怎么能支持事务呢
我之前只在mysql中接触过事务。
事务本质上是一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
mysql的事务有以下特性:原子性、一致性、隔离性、持久性’
Redis.单条命令式保存原子性的,但是事务不保证原子性!
Redis事务没有隔离级别的概念
所有的命令在事务中,并没有直接被执行。只有发起执行命令的时候才会执行。
Redis的事务很简单拢共就三个命令:
1:开启事务
multi
2:命令入队
正常的redis操作命令
3:执行事务
exec
下边是redis事务的完整代码:
127.0.0.1:6379> multi # 开始事务
OK
127.0.0.1:6379(TX)> set k1 v1 # 命令入队
QUEUED
127.0.0.1:6379(TX)> set k2 v2 # 命令入队
QUEUED
127.0.0.1:6379(TX)> set k3 v3 # 命令入队
QUEUED
127.0.0.1:6379(TX)> get k3 # 命令入队
QUEUED
127.0.0.1:6379(TX)> exec # 执行事务
1) OK
2) OK
3) OK
4) "v3"
4:放弃事务
discard
实例如下:
127.0.0.1:6379> multi # 开始事务
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> discard # 结束事务
OK
127.0.0.1:6379>
5:编译型异常(代码有问题,命令有错),事务中所有的命令都不会被执行
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> set kk1 vv1 # 命令加入队列
QUEUED
127.0.0.1:6379(TX)> set kk2 vv2 # 命令加入队列
QUEUED
127.0.0.1:6379(TX)> getset kk2 # 错误 命令加入队列
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)> set kk3 vv3 # # 命令加入队列
QUEUED
127.0.0.1:6379(TX)> exec # 事务中含有错误的命令,所以事务执行失败
(error) EXECABORT Transaction discarded because of previous errors.
上方的实例目的在模拟,实际工作中也可能会出现这种情况
6:运行时异常(1/0),如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常
127.0.0.1:6379> set kk val # 设置一个key value是字符
OK
127.0.0.1:6379> get kk # 获取kk
"val"
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> incr kk # kk + 1(一定是失败的,字符串没有办法+1)
QUEUED
127.0.0.1:6379(TX)> set kk1 vv1 # 命令入队列
QUEUED
127.0.0.1:6379(TX)> set kk2 vv2 # 命令入队列
QUEUED
127.0.0.1:6379(TX)> set kk3 vv3 # 命令入队列
QUEUED
127.0.0.1:6379(TX)> exec # 执行命令
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) OK
通过上方结果,我们发现,只有第一个命令执行失败了,其他命令都执行成功了。
命令入队列的时候就报错,那么久需要处理这个异常,否则整个事务都会执行失败。
命令入队列的时候不报错,执行的时候报错,不会影响队列中其他的命令执行
以上大概就是redis事务的基本原理及命令行使用。
有好的建议,请在下方输入你的评论。