Redis重制(十二)事务

22 阅读3分钟

接下来,我们来学习一下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:6379set kk val                 # 设置一个key value是字符
OK
127.0.0.1:6379get 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事务的基本原理及命令行使用。

 

有好的建议,请在下方输入你的评论。