Redis事务是什么

  1.可以一次执行多个命令,本质是一组命令的集合。

  2.一个事务中的所有命令都会被序列化,按顺序串行化执行而不会被其他命令插入,不许加塞。

    意味着redis在事务执行的过程中,不允许另一个客户端发出请求,保证了隔离性。

  3.在一个redis事务中,不能保证原子性,下面案例会说明。

 

Redis事务可以做什么

  一个队列中,一次性,按顺序,排他的执行一组命令

 

Redis事务命令

redis存map集合缓存 如何去除数据返回 redis存放map_redis

 

怎么使用

1.multi,exec简单的使用

multi : 开启事务

每次输入命令不会马上执行,而是返回queued,表示命令已给服务器接收并且暂时保存起来

exec : 执行事务

redis存map集合缓存 如何去除数据返回 redis存放map_语法错误_02

2.出现错误的情况

2.1 运行错误

首先插入了string 类型的 key 为 k1 的数据,之后又插入了 set 类型的 key为 k1 的数据,

那么在这组命令执行前,redis是无法发现这种非语法错误的

调用exec后,redis执行,会报出错误信息,但是正确的语句依然会被执行。

所以可以看出,事务的操作不是原子性的(要么都成功,要么都失败)

redis存map集合缓存 如何去除数据返回 redis存放map_Redis_03

2.2 语法错误

在插入的时侯,语法发生错误,redis会检测出来

当执行exec时,所有的操作都会被取消

所有语法错误的时侯,redis是满足原子性的

redis存map集合缓存 如何去除数据返回 redis存放map_语法错误_04

 

Redis事务不支持回滚功能,需要使用者自己收拾烂摊子

 

 3.watch的使用

 一旦其中有一个键被修改(或删除),之后的事务就不会执行。

监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)。

 3.1 在multi前改变数值

先设置了 no1 的值为 10,调用watch 监控 no1

在事务执行前,修改了no1的值

执行事务,发现事务执行失败

redis存map集合缓存 如何去除数据返回 redis存放map_redis_05

 3.2 在multi中改变值

在事务外监控av的值,开启事务multi

改变监控的值,并设置新值,事务执行成功

可以看出multi后改变监控的值是可以的,因为执行了exec后,watch就失效了

redis存map集合缓存 如何去除数据返回 redis存放map_Redis_06

 3.3 再举个例子

redis存map集合缓存 如何去除数据返回 redis存放map_Redis_07

 

4.discard使用

 

redis存map集合缓存 如何去除数据返回 redis存放map_Redis_08