Redis事务还能这么玩?
2020-07-14 06:06
113 查看
一、Redis
事务是什么
可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地进行串行化执行而不会被其他命令插入,不许加塞。说白了就是批处理,一次性执行一堆命令,
Redis官网也明确说了支持事务,有关的命令有
MULTI、
EXEC、
DISCARD和
WATCH等,同时从
Redis 2.2版本后支持
check-and-set操作
二、Redis
事务能干嘛
一个队列中,一次性、顺序性、排他性的执行一系列命令,对于传统的关系型数据库来说一致性要求特别严格,一系列命令要么全部成功要么全部失败。
NoSQL并不是这样,继续往下看。
三、Redis
事务怎么玩
官网给出了玩转事务的方法。使用
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准备提交发现版本号变了,立刻报异常,只能再次读取数据修改后再次提交,直到修改完成为止。乐观锁机制再修改数据时不会加锁。
在监视
balance时候,在另一个地方修改了
balance值,最终导致事务失败,本次修改操作失败,同时在另一个客户端能够修改表名
watch时没有上锁,使用的是乐观锁机制。
相关文章推荐
- NoSQL数据库之Redis数据库管理六 (Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存)
- 【Redis学习笔记(七)】 Redis中的事务
- HUAWEI HiAI 3.0 分布式,瑜伽、开车还能这么玩......
- redis事务
- Redis-事务
- redis 事务
- Redis事务
- Redis事务--Redis系列七
- redis--13.redis事务
- spring-data-redis的事务操作深度解析--原来客户端库还可以攒够了事务命令再发?
- Redis事务介绍
- Redis学习手册(事务)(转)
- Redis事务介绍
- Redis的事务
- Redis事务
- Redis-事务(multi,exec,watch,unwatch)
- redis 事务
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- redis 事务实现原理
- redis的事务和watch