Redis7【④ 事务 管道】

news2024/11/16 5:18:48

1. Redis事务

Redis 事务(Transaction)是一组 Redis 命令的集合,这些命令被当作一个整体,按顺序地串行化执行,而不会被其他命令插入。

Redis 事务使用 MULTI、EXEC、WATCH、DISCARD 和 UNWATCH 这些命令来实现。


1.1. Redis事务特性

Redis事务 VS 数据库事务
在这里插入图片描述

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 不保证原子性:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。
  • 排他性:Redis会保证一个事务内的命令依次执行,不会被其他命令插入。

1.2. Redis事务命令

MULTI:开启事务

EXEC:执行事务

DISCARD:取消事务

WATCH key [key ...]:监控指定的key

UNWATCH :取消监控。

1. MULTI

标记一个事务块的开始。执行的命令都会放到一个队列中,通过EXEC命令统一执行。

2. EXEC

执行事务队列中的命令。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9W1HlKeo-1687935510274)(img/2023-04-13_005226.png)]

3. DISCARD

放弃事务。在开启了事务后,若不想执行命令了,可以通过DISCARD命令来取消事务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64i5deAE-1687935510275)(img/2023-04-13_010054.png)]

4. WATCH

监控指定的key的变化,要先开启监控,再开启事务。若监控的数据被篡改了,则事务中无法再对其修改,会返回nil。

执行完EXEC命令后,之前加的监控都会失效。

redis使用watch来提供乐观锁,类似于CAS(Check and Set)。

乐观锁(Optimistic Lock), 顾名思义就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。如果有则取消当前操作让他人操作生效。乐观锁策略:提交版本要比当前记录版本高。

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
一旦执行了exec之前加的监控锁都会被取消掉了,当客户端连接丢失的时候(比如退出连接),所有东西都会被取消监视

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctott7Pb-1687935510275)(img/2023-04-13_014123.png)]

5. UNWATCH

取消监控。在对某个key监控后,已经发现了它被篡改过了,可以使用unwatch命令取消对该key的监控。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCnSoN8o-1687935510276)(img/2023-04-13_015330.png)]

1.3. 不保证原子性

1. ”全体连坐“

要么都执行,要么都不执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xei938Er-1687935510276)(img/2023-04-13_021448.png)]

2. “冤头债主”

错误的命令报错归报错,正确的命令依旧执行,即使在错误命令之后也会执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yb9BMg1q-1687935510276)(img/2023-04-13_020726.png)]

1.4. 事务执行流程

​ (1)开启:以MULTI命令开启一个事务

​ (2)入队:将多个命令假如到事务队列中,接到这些命令并不会立即执行。

​ (3)执行:由EXEC命令执行事务队列中的命令。

2. Redis管道

在这里插入图片描述
在这里插入图片描述

Redis 管道(Pipeline)是一种在客户端和 Redis 服务器之间建立的双向通道,它可以让客户端在一次请求中发送多个命令并一次性接收多个命令的响应结果。通过使用 Redis 管道,客户端可以减少网络通信的次数,从而提高 Redis 的吞吐量和性能。

在传统的 Redis 操作中,每个命令都需要通过网络发送到 Redis 服务器,然后等待 Redis 服务器返回响应结果后再进行下一个命令的操作,这样就会产生大量的网络通信开销。而使用 Redis 管道,客户端可以将多个命令一次性发送到 Redis 服务器,然后一次性接收所有命令的响应结果,从而减少网络通信的次数和开销。


2.1. pipeline的使用

首先创建一个文件,写入需要执行的命令集。
在Linux终端使用cat cmd.txt | redis-cli -a 123456 --pipe命令将命令集传输到服务器。
(管道符”|“表示将前面命令的结果集作为参数传输给后面的命令)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sc6I6aGs-1687935528828)(img/2023-04-13_030844.png)]

2.2. Pipeline小总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统:进程控制

文章目录 1 创建进程2 进程终止2.1 进程退出情况2.2 进程终止的常见方式2.2.1 return语句2.2.2 exit()函数2.2.3 _exit()函数 3进程等待3.1 进程等待的重要性3.2 进程等待的方法3.2.1 wait()方法3.2.2 waitpid()方法 4 进程替换4.1 替换原理4.2 替换函数 1 创建进程 fork()函数…

mediapipe 手势节点识别自动控制音量

参考:https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数: VolumeHandControl.py import cv2 import time import numpy as np import HandTrackingModule as htm import math from ctypes import cast, POINTER from comtypes imp…

[问题解决] ubuntu 18.04 GPU驱动安装

删除当前显卡驱动[参考] sudo apt-get purge nvidia* 查看推荐驱动 sudo ubuntu-drivers devices 安装对应驱动 sudo apt install nvidia-driver-530 验证安装是否成功:nvidia-smi

「一本通 3.2 例 3」架设电话线

题目大意 在加权无向图上求出一条从 号结点到 号结点的路径,使路径上第 大的边权尽量小。 思路 由于是一次性的,且这题数据极小,考虑 正常情况下是来更新数组的,不过这次是更新 表示第个节点,(可以…

springboot引入外部sdk,以及在maven中配置,以及连同sdk打包

目录 1 安置sdk 2 配置maven配置文件 3 刷新maven即可 4 打包配置 1 安置sdk 将外部的sdk放在项目的指定目录下,我选择放在resource/sdk的目录下 示例: 2 配置maven配置文件 打开pom.xml,新增以下的依赖配置 具体如下所示: …

C# OpenCvSharp 透视变换(图像摆正)Demo

效果 Demo下载 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using OpenCvSharp; using OpenCvSha…

王爽《汇编语言》期末考试题库(附答案)

单选题 第一章 PC机的最小信息单位是( )。 A. bit B. 字节 C. 字长 D. 字 A PC机的最小信息单位是比特(bit),常用来表示一位二进制数字(0或1)。字节(byte)是计算机中常用的数据单位,一个字…

vscode中ModuleNotFoundError: No module named ‘torch‘解决方法

文章目录 遇到的问题解决方法参考 遇到的问题 使用vscode训练模型,没有使用远程服务器,使用本地运行代码,显示“ModuleNotFoundError: No module named ‘torch’” 解决方法 这是因为没有选择合适的python解释器。如何选择正确的解释器呢&…

【HDFS实战】HDFS上的数据均衡

HDFS上的数据均衡简介 文章目录 HDFS上的数据均衡简介重新平衡数据节点之间的数据块相关命令 重新平衡DN内磁盘间的数据相关命令PlanExecuteQueryCancelReport 相关配置调试 HDFS上的balance目前有两类: Balancer:节点之间的balanceDisk Balancer&#x…

C# WinForm 学习记录

1.为项目添加dll引用 在“解决方案资源管理器”面板中选择项目,单机鼠标右键,弹出菜单中选择“添加”->“引用”打开引用管理器,选择浏览添加自己需要的dll文件即可 2.位移运算符使用技巧 在进行位移运算时,当数值的二进制数…

设计模式学习笔记——你真的学透单例模式了吗

你真的学透单例模式了吗 一、概述 单例模式(Singleton Pattern)指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点,属于创建型设计模式 二、类图 三、通用写法 public class SingletonTest {public static vo…

使用docker安装redis,修改密码

1、搜索镜像 docker search redis 2、拉取镜像 docker pull redis 3.创建容器 前边是宿主机端口 后面是docker使用的端口 docker run --name redis -p 6379:6379 redis-test --requirepass 123456 这里密码设置为123456 4、如何修改密码 现有的redis创建密码或修改密码…

Python学习——字符串

一、字符串 字符串也是基本数据类型,是一个不可变的字符序列,字符串可以用单引号,双引号,三引号进行定义。 字符串的驻留机制,简而言之,就是相同的字符串只保留一个,后续创建相同字符串的时候&a…

【漏洞案例】云上攻防-记一次打穿云上内网的攻防实战

0x01 外网打点,但在云上 目标单位就给出了一个子域名和一个IP,访问给出的子域名就一个登录框,测试了下忘记密码处有用户名枚举,但登录功能做了登录失败处理,知道用户名也无法进行爆破。 登录时会调用api.target.com域…

CICflowmeter安装使用

项目地址:https://github.com/ahlashkari/CICFlowMeter前置条件:maven,winpcap或其他抓包工具,ideal或 Eclipse 用 ideal 打开项目,发现还需要 jnetpcap 包,但是 maven 仓库好像没有,自己编译 …

思科(Cisco)日志分析工具

作为网络安全管理员,实时监控和分析思科防火墙日志至关重要。对于安全网络,管理员需要: 检测各种网络攻击,并查明攻击的来源和类型(思科实时日志查看器)。跟踪思科防火墙上未经授权的登录尝试。获取有关活…

PHP OA协同办公管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP OA协同办公管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/87959360https://do…

wireshark抓包工具常用功能

wireshark工具面板如下图所示: 本文记录我比较常用的功能。如果有大佬还用过其他功能麻烦指点一二。 抓包、查找、过滤、数据分析。 菜单工具栏: 设置时间戳格式: 为了方便自己查看,把时间戳格式设置为自己认为比较好看的格式…

ThinkPHP6 请求

ThinkPHP6 请求 前言一、 获取请求二、request其他方法三, 请求信息总结 前言 什么是请求,就是 G E T 和 _GET和 G​ET和_POST类似的东西 一、 获取请求 获取请求可以使用$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,也可…

Android——快速设置Quick Settings Tile(创建自定义快速设置磁贴)

Android——快速设置Quick Settings Tile(创建自定义快速设置磁贴) 简介快速设置磁贴的使用场景创建磁贴创建自定义图标创建并声明你的tile服务 管理你的tile服务TileService生命周期选择监听模式Active mode (推荐)Non-active mode Tile状态更新Tile处理…