Redis事务&管道

文章目录

    • 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

  • 命令不会立即执行,而是会先放到一个队列中。

  • 一次性、顺序性、排他性的执行一系列命令。
    Redis事务&管道_第1张图片

(2)放弃事务
  • multi --> discard

  • 在执行事务之前可以通过命令取消事务。
    Redis事务&管道_第2张图片

(3)全体连坐
  • 当事务中一条命令出错,则整个事物都不能执行。

  • 会产生报错。

    Redis事务&管道_第3张图片

(4)冤头债主
  • 加入队列时未检查出错误,只有在运行时才会意识到错误。

  • 则错误的命令会报错,其他命令正常执行。

    Redis事务&管道_第4张图片

(5)watch监控
  • 使用watch来提供乐观锁定,类似于CAS。

  • 监控中的key在执行事务前被修改,则整个事务都不能执行。

  • 一旦执行exec之前加的监控锁都会被取消。

  • 当客户端连接丢失的时候(比如退出链接)、所有东西都会被取消监视。

Redis管道

1.简介
(1)什么是管道技术
  • 管道技术(Pipeline)是客户端提供的一种批处理技术。
  • 用于一次处理多个 Redis 命令,从而提高整个交互的性能。
  • 用来优化频繁命令往返造成的性能瓶颈。
(2)功能
  • 可以一次性发送多条命令给服务端,服务端依次处理完完毕后,通过一条响应一次性将结果返回。
  • 通过减少客户端与redis的通信次数来实现降低往返延时时间。
  • 实现的原理是队列,先进先出特性就保证数据的顺序性。
  • 仅仅是将命令打包一次性发送,对整个Redis的执行不造成其它任何影响批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)。
2.实操案例
(1)准备文件
  • 原生批命令无法同时操作不同数据类型的命令,要通过文件来处理。

  • 将一系列操作命令写到txt文件中。

    Redis事务&管道_第5张图片

(2)处理打包文件
  • cat cmd.txt | redis-cli -a xxxx --pipe

  • 将文件通过管道传到redis中执行。

    在这里插入图片描述

3.小总结
(1)与原生批量命令对比
  • 原生批量命令是原子性的,而pipeline是非原子性。
  • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令。
  • 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成。
(2)与事务对比
  • 事务具有原了性,管道不具有原子性。
  • 管道一次性将多条命令发送到服务器,事务是一条一条的发,事务只有在接收到exec命令后才会执行。
  • 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会。
(3)使用注意事项
  • pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令。
  • 使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能久,同时服务端此时也被迫回复一个队列答复,占用很多内存。

你可能感兴趣的:(redis,redis,数据库,java,缓存)