redis事务

Posted java叶新东老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis事务相关的知识,希望对你有一定的参考价值。

redis事务的特性

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

redis事务和mysql事务的区别

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

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

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

使用

# 开启事务
multi

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

# 提交事务
exec

redis事务的执行原理

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

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

wathc命令实现乐观锁

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

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

watch k1 # 开启监听

multi # 开启事务

get k1  # 第一个命令

keys *  # 第二个命令

exec # 提交,在提交之前,如果有其他的客户端修改了k1的值,那么这个事务就会失效;执行exec后会返回`(nil)`表示事务失败了;

以上是关于redis事务的主要内容,如果未能解决你的问题,请参考以下文章

Redis源代码分析(十七)--- multi事务操作

redis代码解析-事务

Redis事务入门及命令

19 事务 相关操作

19 事务 相关操作

Redis事务入门及命令