当前位置: 首页 > news >正文

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的工作原理&#xff0…...

同济子豪兄模板 半天搞定图像分类

同济子豪兄模板 半天搞定图像分类 ‘’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…...

Qt 6实战:用Q3DScatter在C++中实现动态3D点云可视化(附完整源码)

Qt 6实战:用Q3DScatter在C中实现动态3D点云可视化(附完整源码) 在工业测量、自动驾驶和科学计算领域,3D点云可视化正成为数据交互的核心需求。当我们需要处理激光雷达扫描、三维重建或流体动力学模拟产生的海量空间数据时&#xf…...

Emscripten构建优化指南:针对不同目标平台的终极优化策略

Emscripten构建优化指南:针对不同目标平台的终极优化策略 【免费下载链接】emscripten Emscripten: An LLVM-to-WebAssembly Compiler 项目地址: https://gitcode.com/gh_mirrors/em/emscripten Emscripten是一个强大的LLVM到WebAssembly编译器,它…...

在Windows 11上为Intel Iris Xe显卡配置PyTorch CPU环境:从Anaconda到成功验证

1. 为什么选择PyTorch CPU版本? 很多刚入门深度学习的同学可能会疑惑:为什么我的Intel Iris Xe显卡不能用GPU加速?其实这个问题涉及到硬件架构的差异。NVIDIA显卡之所以能加速深度学习计算,是因为它们内置了专门设计的CUDA核心&am…...

全自动铺布机选购指南:核心指标与品牌实力评估

投资一台全自动铺布机是企业的重要决策。如何在海量品牌中做出最优选择?关键在于穿透营销宣传,从“硬指标”和“软实力”两个维度进行综合评估。核心性能指标张力控制精度:这是衡量铺布机性能的核心指标。直接决定能否处理针织、弹力、真丝等…...

wso~.升级到.需要更新的数据表戳

1. 架构背景与演进动力 1.1 从单体到碎片化:.NET 的开源征程 在.NET Framework 时代,构建系统主要围绕 Windows 操作系统紧密集成,采用传统的封闭式开发模式。然而,随着.NET Core 的推出,微软开启了彻底的开源与跨平台…...

ADXL335模拟加速度计驱动库:轻量级嵌入式ADC采集方案

1. 项目概述 7Semi ADXL335 Accelerometer 是一款面向嵌入式平台的轻量级模拟加速度传感器驱动库,专为 ADXL335 这一经典三轴模拟输出 MEMS 加速度计设计。该库并非基于数字通信协议(如 IC 或 SPI),而是直接采集 X、Y、Z 三路模拟…...

MMA7660FC加速度传感器驱动开发与嵌入式集成实践

1. MMA7660FC加速度传感器技术解析与嵌入式驱动开发实践1.1 器件定位与工程价值MMA7660FC是飞思卡尔(现NXP)推出的超低功耗、高灵敏度三轴数字加速度传感器,采用IC接口通信,封装尺寸仅为3mm 3mm 0.9mm(QFN-12&#x…...

数据的基本操作——去重

duplicated() DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行。具体用法如下:In[1]: df DataFrame({k1:[one]*3 [two]*4, k2:[1,1,2,3,3,4,4]}) In[2]: df Out[2]: k1 k2 0 one 1 1 one 1 2 one 2 3 two 3 4 two …...

【模拟IC】从指标到参数:二级运放GBW与相位裕度的设计实战

1. 理解GBW与相位裕度的工程意义 第一次接触运放设计时,看到GBW100MHz、PM>60这样的指标要求,就像拿到一张没有说明书的电路图。作为从业十年的模拟IC工程师,我至今记得当初面对这些抽象参数时的困惑。**增益带宽积(GBW)和相位裕度(PM)**本…...

GFF3格式完全解析:从基因组注释到可视化实战教程

GFF3格式完全解析:从基因组注释到可视化实战教程 基因组注释是生物信息学分析中的核心环节,而GFF3作为当前主流的注释格式,其结构化设计能够精准描述基因、转录本、外显子等元素的层级关系。本文将带您深入理解GFF3的规范细节,并通…...