redis事务

发布时间:2022-03-01 10:14:03 作者:yexindonglai@163.com 阅读(967)

redis事务的特性

  • 不同的客户端之间的事务不会互相阻碍;
  • 事务是一个原子操作,要么全部执行,要么全部都不执行,没有中间状态;
  • redis的事务不支持回滚;作者认为,程序失败是由编程错误造成的,而这些错误应该在开发的时候就被发现;还有一点是redis不支持事务可以保证简单且快速;所以,在未提交的情况,不会更新key值!

在这里插入图片描述

redis事务和mysql事务的区别

  1. redis的事务没有mysql的事务那么完整;

  2. mysql的事务是为了保证最终一致性的,所以在修改数据时会加锁;

  3. redis因为是单进程的,它为了保证速度,不会加锁,谁最后提交就以谁为主;最先提交的那个会被最后提交的覆盖掉;
    在这里插入图片描述

使用

  1. # 开启事务
  2. multi
  3. # 在开启事务和提交事务中间的代码都会进入到redis 的队列里面;当你执行exec提交后,redis会将队列里面的名字依次执行;
  4. # 事务操作命令...
  5. # 提交事务
  6. exec

redis事务的执行原理

redis事务的本质其实是将命令存储在一个队列里面,当执行exec命令提交后按依次执行队列中的命令

  1. 127.0.0.1:6379> MULTI // 开启事务
  2. OK
  3. 127.0.0.1:6379> set key1 hello
  4. QUEUED # 第一个命令加入到了队列中
  5. 127.0.0.1:6379> keys *
  6. QUEUED # 第二个命令加入到了队列中
  7. 127.0.0.1:6379> exec // 提交
  8. 1) OK # 第一个命令的执行结果
  9. 2) 1) "sumkey1" # 第二个命令的执行结果
  10. 2) "key1"
  11. 3) "k2"
  12. 4) "sumkey"
  13. 5) "sumkey2"
  14. 6) "k1"

在这里插入图片描述

wathc命令实现乐观锁

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

  1. watch k1 # 开启监听
  2. multi # 开启事务
  3. get k1 # 第一个命令
  4. keys * # 第二个命令
  5. exec # 提交,在提交之前,如果有其他的客户端修改了k1的值,那么这个事务就会失效;执行exec后会返回`(nil)`表示事务失败了;

关键字Redis