Redis

redis 事务 transaction
相关命令

  • DISCARD
  • EXEC
  • MULTI
  • UNWATCH
  • WATCH

事务

multi, exec, discard, watch 是redis 事务的基础。他们允许在单个步骤执行一组命令。有两个重要的保证。

  • 在一个事务的所有命令 都被序列化并且顺序执行。永远不会发生在一个事务的执行的时候另一个client 插入一条请求。这保证了这些命令作为单个隔离的命令。
  • 命令要么全部执行,要么全都不执行。所以Redis 事务是原子的
    EXEC 命令触发这个事务的所有命令的执行。

使用

使用multi 命令开始Redis的事务,这个命令总是返回ok。此时用户可以发出多个命令。而不是执行这些命令。redis 会把它放队列里。一旦EXEC命令被调用,所有命令都会被执行
调用discard 会刷新这个事务 队列,并且退出事务。

> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

exec 返回一个返回值的数组。这个数组的每个元素是这个事务的每个命令的响应,按命令相同的顺序执行。

在事务里的错误

在一个事务中可能会出现以下这两种错误

  • 一种是在exec 命令调用之前,例如: 语法错误,内存不够
  • 在调用exec 命令之后,例如: 针对字符串值调用列表的操作
    在redis 2.6.5 之后,服务器针对第一种错误会拒绝执行事务,并返回一个错误。自动丢弃这个事务。
    在redis2.6.5 之前,会执行正确的那些命令。所以新的行为(2.6.5 之后的行为)能够使他更简单的修复事务。
    exec命令调用失败之后: 所有其他命令都会被执行,即时有些命令执行失败了。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 3
QUEUED
127.0.0.1:6379> lpop a
QUEUED
127.0.0.1:6379> set a 2
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get a
"2"

redis 事务不支持回滚
为什么不支持回滚?

  • redis 命令失败的原因只会是语法错误

  • redis 内部更简单,更快,因为不需要回滚

WATCH

乐观锁
watch 被用来提供check-and-set(CAS) 行为对于redis 事务
例子
client 1

> watch a
> multi
> incr a

client2

> multi
> incr a
> exec

然后client1

> exec
(nil)

当监视的key 在事务期间内被修改了,那exec命令会返回nil来通知事务失败了。

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

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 3,441评论 0 40
  • 超强、超详细Redis入门教程 转载2017年03月04日 16:20:02 16916 转载自: http://...
    邵云涛阅读 17,502评论 3 313
  • Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务功能, 本章首先...
    binge1024阅读 527评论 0 2
  • 文章已经放到github上 ,如果对您有帮助 请给个star[https://github.com/qqxuanl...
    尼尔君阅读 2,290评论 0 22
  • 【本教程目录】 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动r...
    徐猿猿阅读 1,879评论 0 35