Redis_事务操作
13. redis事务操作
13.1事务简介
原子性(Atomicity)
一致性(Consistency)
隔离性(isolation)
持久性(durabiliby)
ACID
13.2 Redis事务
提供了multi、exec命令来完成
- 第一步,客户端使用multi命令显式地开启事务
- 第二步,客户端把事务中要执行的指令发送给服务器端,例如set 、get 、lpush,这些指令不会立即执行,进入一个队列中
- 第三步,客户端向服务器发送一个命令 exec,来完成事务提交。当服务器端收到这个指令后,实际去执行上一步中的命令队列.
multi set k1 v1 set k2 v2 set k3 v3 get k1 exec multi set k4 v4 set k5 v5 discard //取消
13.3 Redis的事务处理机制
13.3.1 原子性
第一种情况
- 在执行exec指令前,客户端发送操作命令有误,redis会报错并记录这个错误。此时,还可以继续发送命令操作,在执行exec命令之后,redis拒绝执行所有提交的指令,返回事务失败的结果。(保证了原子性)
multi set k1 v1 get k1 v1 set k2 v2 exec 整个队列失败
第二种情况
- 向服务器发送指令,其中有指令和操作的数据类型不匹配,放入队列时并没有报错。使用lpop指令操作失败,但get指令成功了。(不能保证原子性)
multi lpop k1 //失败 get k1 //成功 exec
第三种情况
- 在执行事务的exec指令时,redis实例发生了故障,导致事务执行失败
- 如果redis开启了aof日志,可能会有一部分指令被记录到AOF日志中,需要使用redis-check-aof 去检查aof文件,将未完成事务操作从aof清除,从而保证原子性
13.3.2 一致性
- 第一种情况,指令进入队列时就报错,整个事务全部被放弃执行,可以保证数据的一致性。
- 第二种情况,进入队列时没有报错,实际执行时报错,有错误的指令不去执行,正确的指令可以正常执行,可以保证数据的一致性
- 第三种情况,exec指令时redis实例发生故障,根据RDB和AOF情况来做判断
- 如果没有开启rdb和aof,数据在重启后没有,一致的
- 如果使用了rdb方式,rdb不会在事务执行的时候去保存数据,数据库也是一致的
- 使用aof日志,如果事务队列操作记录没有进入aof,可以保证一致性。如果已加入了一部分,使用redis-check-aof清除事务中已完成的操作,保证事务的一致性
13.3.3 隔离性
提交exec指令去执行事务,分成exec之前和exec之后两种情况
并发操作在exec指令前,要实现隔离性的保证 ,需要使用watch机制,否则不能保证隔离性
在事务执行前,相当于有一个监控器,在监控key是否已经被修改过了,如果已修改,则放弃事务执行,避免了事务的隔离性被破坏。如果客户再次执行,此时,没有其他客户端去修改数据,则执行成功。
悲观锁:synchronized
乐观锁:Atomic原子操作
使用unwatch取消watch命令对所有key的监控。
13.3.4 持久性
redis内存数据库,取决于持久化配置模式
不开启rdb和aof,只当作缓存使用,是不能保证持久性
使用rdb,如果在一个事务执行后,下一次的rdb快照还未执行前,redis实例发生故障了,不能保证持久性
使用aof, 配置选项 everysec、always、no,也不能保证持久性
不管redis采用什么配置模式,都不能保证事务的持久性
相关文章:

Redis_事务操作
13. redis事务操作 13.1事务简介 原子性(Atomicity) 一致性(Consistency) 隔离性(isolation) 持久性(durabiliby) ACID 13.2 Redis事务 提供了multi、exec命令来完成 第一步,客户端使用multi命令显式地开启事务第二步,客户端把事务中要执行的指令发…...

python质检工具(pylint)安装使用总结
1、Pylint Pylint工具主要类似java中的checkStyle和findbugs,是检查代码样式和逻辑规范的工具。 1.1、Pylint安装流程: 打开PyCharm软件,打开如图1.1所示Terminal终端窗口,先查看python版本和pip版本,pip是19.0.3,python是2.7 图1.1 运行pip install pylint安装pylin…...
“深入探究JVM:解密Java虚拟机的工作原理“
标题:深入探究JVM:解密Java虚拟机的工作原理 摘要:本文将深入探究Java虚拟机(JVM)的工作原理,包括JVM的组成部分、类加载过程、内存管理、垃圾回收机制以及即时编译器等。通过了解JVM的工作原理࿰…...
同济子豪兄模板 半天搞定图像分类
同济子豪兄模板 半天搞定图像分类 ‘’import cv2 import numpy as np import time from tqdm import tqdm 视频逐帧处理代码模板 不需修改任何代码,只需定义process_frame函数即可 def generate_video(input_path‘videos/robot.mp4’): filehead input_path.…...

接口自动化测试,Fiddler使用抓包辅助实战,一篇彻底打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、快捷设置&…...

概念解析 | 隐式神经表示:揭开神经网络黑盒的奥秘
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:隐式神经表示(Implicit Neural Representations) 隐式神经表示:揭开神经网络黑盒的奥秘 近年来,神经网络在各种任务上取得了惊人的进步,但其内部表示方式依然难以解读,被称为“…...
深入浅出PHP封装根据商品ID获取淘宝商品详情数据方法
要通过淘宝的API获取商品详情,您可以使用淘宝开放平台提供的接口来实现。以下是一种使用PHP编程语言实现的示例,展示如何通过淘宝开放平台API获取商品详情: 首先,确保您已注册成为淘宝开放平台的开发者,并创建一个应用…...

自动切换HTTP爬虫ip助力Python数据采集
在Python数据采集中,如果你需要爬取一些网站的数据,并且需要切换IP地址来避免被封或限制,我们可以考虑以下几种方式来实现自动切换HTTP爬虫IP。 1. 使用代理服务器 使用代理服务器是常见的IP切换技术之一。你可以购买或使用免费的代理服务器…...

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音
20230811导出Redmi Note12Pro 5G手机的录音机APP的录音 2023/8/11 10:54 redmi note12 pro 录音文件 位置 貌似必须导出录音,录音的源文件不知道存储到哪里了! 参考资料: https://jingyan.baidu.com/article/b87fe19e9aa79b1319356842.html 红…...

Python-OpenCV中的图像处理-傅里叶变换
Python-OpenCV中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…...

8.10 用redis实现缓存功能和Spring Cache
什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据,减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…...

SPI协议个人记录
SPI协议 SPI(Serial Peripheral Interface)是一种同步串行接口技术,由Motorola公司推出。SPI总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信和数据交换。外围设备包括FLASHRAM、A/D转换器、网络控制器…...

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles
文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功,但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…...

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比
时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …...

【软件工程】面向对象方法-RUP
RUP(Rational Unified Process,统一软件开发过程)。 RUP特点 以用况驱动的,以体系结构为中心的,迭代增量式开发 用况驱动 用况是能够向用户提供有价值结果的系统中的一种功能用况获取的是功能需求 在系统的生存周期中…...
Golang 的面向对象
文章目录 duck typingnil不一定是空接口组合代替继承接口转换回具体的类型使用switch匹配接口的原始类型 duck typing golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可 package mainimport "fmt&qu…...

STABLE DIFFUSION模型及插件的存放路径
记录下学习SD的一些心得,使用的是秋叶大佬的集成webui,下载了之后点击启动器即可开启,文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内,一些扩展类的插件是存放在extensions文件夹下...

Three.js 设置模型材质纹理贴图和修改材质颜色,材质透明度,材质网格
相关API的使用: 1 traverse (模型循环遍历方法) 2. THREE.TextureLoader(用于加载和处理图片纹理) 3. THREE.MeshLambertMaterial(用于创建材质) 4. getObjectByProperty(通过材…...

docker 安装mongodb 虚拟机安装mongodb
生产环境直接安装比较好,以及使用集群环境,本文仅测试交流使用,我用来写分布式im测试使用: nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务&…...
在SockJS+Spring Websocket中convertAndSendToUser中的“用户”来自哪里?
目录 一、前言二、Principal三、使用 一、前言 我们知道可以使用客户端订阅的主题前缀从 stomp 服务器向客户端发送消息,例如 /topic/hello。我们还知道我们可以向特定用户发送消息,因为 spring 提供了convertAndSendToUser(username, destination, mes…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...