Redis事务还能这么玩?

一、Redis事务是什么

  可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地进行串行化执行而不会被其他命令插入,不许加塞。说白了就是批处理,一次性执行一堆命令,Redis官网也明确说了支持事务,有关的命令有MULTIEXECDISCARDWATCH等,同时从Redis 2.2版本后支持check-and-set操作
Redis事务还能这么玩?_第1张图片

二、Redis事务能干嘛

  一个队列中,一次性、顺序性、排他性的执行一系列命令,对于传统的关系型数据库来说一致性要求特别严格,一系列命令要么全部成功要么全部失败。NoSQL并不是这样,继续往下看。

三、Redis事务怎么玩

Redis事务还能这么玩?_第2张图片
  官网给出了玩转事务的方法。使用MULTI命令开启事务,这个命令一般会返回OK,但是虽然告诉你这事我收到了,我知道你开启了事务但这事办不办的成两说。这时候你需要提交一系列命令,Redis会将这些命令入队,所有的命令将在EXEC后依次执行,而DISCARD则是取消这次失误,比如你一口气敲了五个命令,发现其中一个出现了错误,你不想再执行就可以使用该命令放弃本次批处理操作。下面将具体介绍一下怎么玩…

3.1 正常执行

清空一下当前数据库,开始玩转事务

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)

通过MULTI开启事务,依次输入五条命令

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

这是第一种情况,命令按序执行

3.2 放弃事务

DISCARD命令的使用,当发现一个事务中某条命令有错误想要终止本次事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get k5
(nil)

下面开始事务的正规玩法

3.3 全体连坐

全体连坐型,这和关系型数据库的事务基本一致,一个命令失败全部失败

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> getset k7
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k8 v8
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"

很显然getset k7命令出错导致整个事务全部失败,下面来看看Redis事务的特色。

3.4 冤头债主

先看操作

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v2
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

这个时候发现虽然在事务中有出错的命令,但是正常的命令却没有失败,即在Redis事务中,正确的命令可以通过,出错的事务EXEC执行时报错,典型的冤有头债有主做法。总结一下Redis事务,一句话:Redis支持部分事务

3.5 watch监控

  watch监控可以实现check-and-set功能,是一种乐观锁处理机制,下面大体说一下乐观锁、悲观锁的概念。
  悲观锁:对事物的发展很悲观,认为一定会有问题产生,为了防止出事,在修改数据时直接把整张表锁了。
  乐观锁:对事物发展乐观,为了防止数据不一致,采用version的方式。线程A拿到id为5的数据去修改,线程B也要去拿id为5的数据准备修改,此时数据的版本号为1,当线程A修改完提交后版本号变为2,这时候线程B准备提交发现版本号变了,立刻报异常,只能再次读取数据修改后再次提交,直到修改完成为止。乐观锁机制再修改数据时不会加锁。Redis事务还能这么玩?_第3张图片
在监视balance时候,在另一个地方修改了balance值,最终导致事务失败,本次修改操作失败,同时在另一个客户端能够修改表名watch时没有上锁,使用的是乐观锁机制。

你可能感兴趣的:(笔记)