Redis事务

什么是事务?

<font style="color:rgb(51, 51, 51);">Redis 事务可以一次执行</font><font style="color:#DF2A3F;">多个命令</font><font style="color:rgb(51, 51, 51);">, 本质是一组指令集,是一个</font><font style="color:#DF2A3F;">单独的隔离操作</font><font style="color:rgb(51, 51, 51);">,事务中的所有命令都会按顺序地串行化执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。</font>

<font style="color:rgb(51, 51, 51);"></font>

<font style="color:rgb(51, 51, 51);">一个事务从开始到执行会经历以下三个阶段:</font>

  • <font style="color:rgb(51, 51, 51);">开始事务:Multi。</font>
  • <font style="color:rgb(51, 51, 51);">命令入队:操作命令。</font>
  • <font style="color:rgb(51, 51, 51);">执行/撤销事务:Exec/discard。</font>

m4gx4tko.png

Redis和MySQL对比

m4gx4y6t.png

事务的错误处理:

  • 如果在入队列阶段出现语法错误
    • 所有命令都不会执行
  • 如果在执行阶段出现错误
    • 只有报错的命令不会执行,其他命令都会执行,不会回滚

Redis锁机制

悲观锁:只有一个线程能操作数据,操作是给数据加锁

乐观锁:对数据不加锁,通过版本号或者时间戳实现

WATCH

在执行multi直线,限制性watch key,可以监视一个或多个key,如果在事务执行之前,这个key被其他命令改动,则停止执行事务。

Redis事务三特性

  • 单独的隔离操作
    • 事务中的所有命令都会序列化执行,事务执行过程中不会被其他事务打断
  • 没有隔离的概念
    • 队列中的命令在事务提交之前都不会被执行。
  • 不保证原子性
    • 在执行阶段,事务中如果有一条命令执行失败,其他命令仍然会被执行。

Redis中的LUA脚本(Redis>2.6)

LUA脚本类似redis事务,具有一定的原子性,不被其他命令插队,可以完成一些事务性操作。

利用lua脚本解决**<font style="color:#DF2A3F;">争抢问题</font>,实际上就是redis利用其单线程的特性,用任务队列的方式解决了多并发问题**。