文章目录
- Redis事务
- 1.简介
- (1)什么是事务
- (2)Redis事务的特点
- 2.实操案例
- (0)事务命令
- (1)正常执行
- (2)放弃事务
- (3)全体连坐
- (4)冤头债主
- (5)watch监控
- Redis管道
- 1.简介
- (1)什么是管道技术
- (2)功能
- 2.实操案例
- (1)准备文件
- (2)处理打包文件
- 3.小总结
- (1)与原生批量命令对比
- (2)与事务对比
- (3)使用注意事项
Redis事务
1.简介
(1)什么是事务
- 事务是指是程序中一系列严密的逻辑操作,所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。
- 可以一次执行多个命令,本质是一组命令的集合。
- 一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。
(2)Redis事务的特点
- 单独的隔离操作:
- 保证事务里的操作会被连续独占的执行。
- 命令执行是单线程架构,在执行完事务内所有指令前不能再去同时执行其他客户端的请求。
- 没有隔离级别的概念:
- 在事务提交前任何指令都不会被实际执行。
- 也就不存在需要隔离的问题。
- 不保证原子性:
- 不保证原子性,也就是不保证所有指令同时成功或同时失败。
- 只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。
- 排他性:
- 保证一个事务内的命令依次执行,而不会被其它命令插入。
2.实操案例
(0)事务命令
-
multi
:标记一个事务块的开始。 -
exec
:执行所有事务块内的命令。 -
discard
:取消事务,放弃执行事务块内的所有命令。 -
watch key [k1 k2]
:监视一个或多个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 -
unwatch
:取消对所有key的监控。
(1)正常执行
-
multi
-->exec
-
命令不会立即执行,而是会先放到一个队列中。
-
一次性、顺序性、排他性的执行一系列命令。
(2)放弃事务
-
multi
-->discard
-
在执行事务之前可以通过命令取消事务。
(3)全体连坐
-
当事务中一条命令出错,则整个事物都不能执行。
-
会产生报错。
(4)冤头债主
-
加入队列时未检查出错误,只有在运行时才会意识到错误。
-
则错误的命令会报错,其他命令正常执行。
(5)watch监控
-
使用watch来提供乐观锁定,类似于CAS。
-
监控中的key在执行事务前被修改,则整个事务都不能执行。
-
一旦执行exec之前加的监控锁都会被取消。
-
当客户端连接丢失的时候(比如退出链接)、所有东西都会被取消监视。
Redis管道
1.简介
(1)什么是管道技术
- 管道技术(Pipeline)是客户端提供的一种批处理技术。
- 用于一次处理多个 Redis 命令,从而提高整个交互的性能。
- 用来优化频繁命令往返造成的性能瓶颈。
(2)功能
- 可以一次性发送多条命令给服务端,服务端依次处理完完毕后,通过一条响应一次性将结果返回。
- 通过减少客户端与redis的通信次数来实现降低往返延时时间。
- 实现的原理是队列,先进先出特性就保证数据的顺序性。
- 仅仅是将命令打包一次性发送,对整个Redis的执行不造成其它任何影响批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)。
2.实操案例
(1)准备文件
-
原生批命令无法同时操作不同数据类型的命令,要通过文件来处理。
-
将一系列操作命令写到txt文件中。
(2)处理打包文件
-
cat cmd.txt | redis-cli -a xxxx --pipe
-
将文件通过管道传到redis中执行。
3.小总结
(1)与原生批量命令对比
- 原生批量命令是原子性的,而pipeline是非原子性。
- 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令。
- 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成。
(2)与事务对比
- 事务具有原了性,管道不具有原子性。
- 管道一次性将多条命令发送到服务器,事务是一条一条的发,事务只有在接收到exec命令后才会执行。
- 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会。
(3)使用注意事项
- pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令。
- 使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能久,同时服务端此时也被迫回复一个队列答复,占用很多内存。