五分钟让你知道你应该知道的 Redis 事务

如果你曾了解过关系型数据库事务的话,我相信这篇文章对你来说是很容易理解的。

具体什么是事务我就不说不多了,直接讲 Redis 事务相关的部分。

首先,我们先来看下,Redis 是怎么执行事务的。

1. 事务执行过程

一个事务的开始到结束会经过以下 3 个过程

1. 事务开始

2. 命令入队

3. 事务执行

show code:

127.0.0.1:6379>multiOK127.0.0.1:6379>setatest1QUEUED127.0.0.1:6379>setbtest2QUEUED127.0.0.1:6379>exec1)OK2)OK127.0.0.1:6379>geta"test1"127.0.0.1:6379>getb"test2"

结合上面的例子,用人话介绍这 3 个过程就是:

Redis 执行 multi 命令标志事务开始,此时 客户端切换至事务状态。

接着,服务端会将除了 exec、discard(取消事务,放弃执行事务块内的所有命令)、watch 和 multi 以外的命令,放进一个先进先出的事务队列中。即上面例子的 2 个 set 命令会被放进队列,并返回 QUEUED 给客户端。

当客户端发送 exec 命令时,服务端会立即执行该命令。遍历这个客户端的事务队列,执行队列保存的所有命令。最后将执行命令所得结果返回给客户端。

2. Redis事务和关系型事务的区别

两者最大区别就是 Redis 事务不支持回滚 。即使事务队列中某个命令在执行期间发生了错误,事务也会继续执行,直到事务队列中所有命令执行完成。

文字貌似不够直观,没事,看下面的例子你就马上明白了。

127.0.0.1:6379> multiOK127.0.0.1:6379> set msgtestQUEUED127.0.0.1:6379> lpop msgQUEUED127.0.0.1:6379> exec1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379> get msg"test"// 不受后面错误命令影响

PS:如果客户端向事务入列一个错误的命令(比如输入一个不存在的命令,像:sett 命令),那么该事务将不被服务端执行。

该情况是入队错误,上面例子是执行错误的情况。

3. watch 命令

坦白讲,提到 redis 事务,就不得不提 watch 命令了。

该命令是一个乐观锁,只能在客户端进入事务状态之前执行。

作用是 exec 命令执行之前,监视任何数量个键,并在 exec 命令执行时,检查被监视的键是否至少有一个已经被修改过。若是则拒绝执行事务,否则执行。

当 exec 执行完成后,这次事务也就结束了。

我们依旧来看一个简单的栗子,你会马上明白的:

127.0.0.1:6379> SET msgtest//设置 msg 的值OK127.0.0.1:6379> WATCH msg //监视 msgOK127.0.0.1:6379> SET msg test2 //修改 msg 的值OK //或其他客户端在该客户端执行 exec 命令之前修改了该 key 的值127.0.0.1:6379> MULTIOK127.0.0.1:6379> SET msg test3QUEUED127.0.0.1:6379> GET msgQUEUED127.0.0.1:6379> EXEC (nil) //执行失败

以上就是文章的全部内容啦

对Java技术,架构技术感兴趣的朋友,关注并私信我“架构”,免费送一些Java架构资料,先到先得!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摘自http://xiaoh.me/2016/06/30/redis-advanced/ 排序 redis支持对l...
    鸵鸟要抬头阅读 66,552评论 1 3
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,354评论 0 36
  • 安全性 设置客户端连接后进行任何其他指令前需要使用的密码。 警告:因为redis 速度相当快,所以在一台比较好的服...
    OzanShareing阅读 1,824评论 1 7
  • redis是一个以key-value存储的非关系型数据库。有五种数据类型,string、hashes、list、s...
    林ze宏阅读 1,022评论 0 0
  • 不知道是不是也有这种经历的朋友:被定义为“文青”,且略带鄙意; 一个人该怎么生活,以什么样的姿态生活,理所应当是自...
    见澈阅读 271评论 0 0