Redis中的事务是什么?

Redis事务是一个单独的格离操作, 事务中的命令都会序列化, 按顺序的执行. 事务在执行的过程中, 不会被其他客户端发送来的命令请求打断.
Redis事务的主要作用就是串联多个命令, 防止别的命令插队.

事务相关命令: Multi, Exec, discard

WlmYOP.md.png

通过multi命名, 打开事务, 然后正常的使用各种命令即可(这个过程称为组队阶段), 最后需要提交事务输入exec命令(执行阶段), 如果需要放弃执行, 则输入discard命令.

事物的错误处理

需要注意的是:

  1. 事务的组队阶段如果出现错误(正常会显示queued), 整个事务执行时就会报错, 并且不会执行任何操作.
  2. 而执行阶段出现错误, 在exec后, 只有出现错误的那一条语句报错, 其他命令正常执行, 如下图所示.

WlnrND.png

事务冲突

例子:
三人共用一个账户, 里面有10000快
第一个人想花8000快, 第二个人想花4000快, 第三个人想要花1000快.
如果同时操作的话, 大家都以为账户里还有10000快, 最终会导致账户负金额.
所以我们就要用事务.

乐观锁, 悲观锁
  1. 悲观锁

悲观锁, 顾名思义, 取数据时, 悲观的认为大家都来和你抢, 所以上锁, 阻止其他人.

每次操作前先上锁, 被人就无法操作了, 等我操作完了, 所打开后别人才能继续操作.
缺点, 效率太低了, 只能一个一个的来.

  1. 乐观锁

乐观锁, 顾名思义, 乐观地认为拿数据的时候别人不会修改, 所以不会上锁.

给数据加一个字段, 版本号, 每个人都能得到数据及其版本号, 先完成操作的, 更新原来的数据以其版本号, 操作的慢的执行时会检测版本号是否一致, 不一致就不能操作.

乐观锁适用于多读地应用类型, 这样可以提高吞吐量, Redis就是利用这种check-and-set机制实现事务的.

watch key1 [key2 ..]

给key加乐观锁
实例:

1
2
3
4
5
6
set k1 1000
watch k1
multi
incrby k1 10
exec
#结果返回110
1
2
3
4
5
watch k1
multi
incrby k1 20
exec
#结果返回nil

Redis事务的特性

  • 单独的隔离操作: 事务中的所有命令都会序列化, 按顺序执行, 事务在执行的过程中, 不会被其他客户端发送来的命令请求打断.
  • 没有隔离级别的概念: 队列中的命令在没有提交之前都不会被实际的执行.
  • 不保证原子性: 事务中如果有一条命令执行失败, 其后的命令仍会执行, 不会回滚.
  • 跟mysql事务性相差较大

Redis秒杀案例