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

redis--事务

redis事务

在Redis中,事务是一组原子性操作的集合,它们被一起执行,要么全部执行成功,要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性,但它仍然提供了一种将多个命令打包成一组执行的机制,适用于需要保持一系列操作的一致性的场景。

常见命令

命令描述
MULTI开启一个事务,标记事务块的开始
EXEC执行事务中的所有命令,并将结果返回
DISCARD取消当前事务,放弃事务中的所有命令
WATCH监视一个或多个键,如果在事务执行前键被修改,事务将被中断
UNWATCH取消对所有键的监视
QUEUED在事务块中的每个命令执行后返回的标识

事务流程

开始事务:使用MULTI命令标记一个事务块的开始。
命令入队:在MULTI之后,所有的命令都不会立即执行,而是被放入一个队列中,每个命令都会返回一个QUEUED的响应。
执行事务:使用EXEC命令触发事务,一并执行事务中的所有命令,并返回一个数组作为结果。如果事务中有语法错误或者类型错误的命令,那么EXEC会返回一个错误,并且不执行任何命令。如果事务中有运行时错误的命令,那么EXEC会跳过这些错误命令,继续执行其他正常的命令。

事务冲突

在Redis中,事务冲突通常指的是在执行事务过程中,多个客户端对相同的键进行修改,从而引发数据不一致的情况。这种情况可能导致事务的结果与预期不符,因为不同客户端可能会在事务中同时修改相同的数据,而事务并不具备真正的隔离性和锁机制,所以可能导致数据冲突。

举个例子,假设有两个客户端在并发地进行购买商品的操作,每个客户端都会从库存中减少相应数量的商品。如果两个客户端同时在事务中减少库存,那么可能会出现如下冲突:

  1. 客户端A读取库存为10,开始执行事务。
  2. 客户端B同时读取库存也为10,开始执行事务。
  3. 客户端A将库存减少3,变成7。
  4. 客户端B将库存减少2,变成8。

在这种情况下,两个客户端的事务冲突,导致库存的最终结果不是预期的。这就是事务冲突引发的问题,可能导致数据不一致性。

为了避免事务冲突,Redis提供了WATCH命令,可以在事务执行前监视一个或多个键,如果在事务执行前有其他客户端对这些键进行了修改,事务会被中断,这样可以减少事务冲突的可能性。但是需要注意,WATCH并不能完全解决事务冲突问题,因为仍然可能在EXEC执行时发生冲突。

乐观锁和悲观锁

乐观锁

乐观锁是一种较为轻量级的并发控制机制,它假定在大多数情况下,事务之间不会发生冲突。在 Redis 中,乐观锁通常通过使用版本号或时间戳来实现。当一个客户端想要修改一个键的值时,它会先获取当前键的版本号或时间戳,然后在修改完成后再次检查版本号或时间戳是否仍然一致。如果一致,说明期间没有其他客户端修改过该键的值,操作可以被提交。如果不一致,说明期间有其他客户端修改了该键的值,操作可能会失败或需要重试。

优点:

  • 适用于多读少写的场景,因为大部分时间数据冲突较少。
  • 不需要长时间的锁定,提高了系统的并发性能。

缺点:

  • 当冲突发生时,需要重试操作,可能会增加系统开销。
  • 无法解决高并发下的复杂冲突。

悲观锁

悲观锁是一种相对较重的并发控制机制,它假定事务之间可能会发生冲突,因此在访问数据之前会对数据进行锁定,以防止其他事务对其进行修改。在 Redis 中,悲观锁通常使用 WATCH 命令来实现,它可以监视一个或多个键,如果在事务执行期间这些键的值发生了变化,事务将被回滚。

优点:

  • 可以确保数据的一致性,适用于复杂的事务场景。
  • 避免了操作冲突,无需重试。

缺点:

  • 长时间的锁定可能降低系统的并发性能。
  • 需要耗费更多的系统资源。

乐观锁和悲观锁的对比:

  1. 性能开销: 乐观锁的性能开销较低,因为它不会长时间地锁定数据,而是在操作时检查冲突。悲观锁在锁定数据的同时,会对系统的并发性能产生一定的影响。

  2. 适用场景: 乐观锁适用于多读少写的场景,因为它假定冲突较少。悲观锁适用于复杂的事务场景,需要确保数据的一致性。

  3. 冲突处理: 乐观锁在发生冲突时需要进行重试操作,而悲观锁可以避免操作冲突,但可能会造成长时间的等待。

  4. 并发性能: 乐观锁可以提高系统的并发性能,因为它不会长时间锁定数据。悲观锁可能会降低系统的并发性能,因为它需要长

相关文章:

redis--事务

redis事务 在Redis中,事务是一组原子性操作的集合,它们被一起执行,要么全部执行成功,要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性,但它仍然提供了一种将多个命令打包成一组执行的机制,适用…...

111. 二叉树的最小深度

111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeN…...

SpringMVC归纳与总结

前言 Spring的核心是IOC,一种依赖反转的解耦思想。MVC是一种处理Web请求的架构模式,当两者的作用结合,就形成了SpringMVC。 组成及运行原理 1. 两次映射 2. 为什么用适配器模式 过滤器与拦截器 1. 范围 静态资源与动态资源2. 生命周期…...

Python学习笔记_进阶篇(三)_django知识(二)

本章内容 Django model Model 基础配置 django默认支持sqlite&#xff0c;mysql, oracle,postgresql数据库。 <1> sqlite django默认使用sqlite的数据库&#xff0c;默认自带sqlite的数据库驱动 引擎名称&#xff1a;django.db.backends.sqlite3 <2>mysql …...

RISC-V 整型通用寄存器介绍

简介 RISC-V64位/32位提供了32个整型通用寄存器&#xff0c;编号是x0~x31&#xff0c;这些整型通用寄存器的宽度与架构位数一致。 浮点数寄存器与整形寄存器一样也提供了32个&#xff1a;f0~f31&#xff0c;位数与架构位数一致。 通用寄存器介绍 零寄存器 x0/zero x0寄存…...

学习Vue:【性能优化】异步组件和懒加载

在Vue.js应用开发中&#xff0c;性能优化是一个至关重要的主题&#xff0c;而异步组件和懒加载是提升性能的有效方法之一。本文将介绍什么是异步组件和懒加载&#xff0c;以及如何在Vue.js中应用这些技术来提升应用性能。 异步组件和懒加载 异步组件 异步组件是指在需要的时候…...

pdf格式文件下载不预览,云存储的跨域解决

需求背景 后端接口中返回的是pdf文件路径比如&#xff1a; pdf文件路径 &#xff08;https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&#xff09; 前端适配是这样的 <ahref"https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&…...

httplib + nlohmann::json上传数据时中文乱码解决

1、nlohmann::json 1.1 编码格式使用UTF-8 参考 nlohmann::json 中文乱码解决方案 &#xff08;1&#xff09;将数据先转为UTF-8格式 2、httplib 2.1 上传数据前 &#xff08;1&#xff09;调用httplib::Response对象的set_header()方法来设置编码格式 httplib::Response res…...

JavaScript中的设计模式之一--单例模式和模块

虽然有一种疯狂天才的感觉可能很诱人&#xff0c;但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题&#xff0c;并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念&#xff0c;并检查单例模式和…...

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…...

css学习4(背景)

1、CSS中&#xff0c;颜色值通常以以下方式定义: 十六进制 - 如&#xff1a;"#ff0000"RGB - 如&#xff1a;"rgb(255,0,0)"颜色名称 - 如&#xff1a;"red" 2、background-image 属性描述了元素的背景图像. 默认情况下&#xff0c;背景图像进…...

二、SQL,如何实现表的创建和查询

1、新建表格&#xff08;在当前数据库中新建一个表格&#xff09;&#xff1a; &#xff08;1&#xff09;基础语法&#xff1a; create table [表名]( [字段:列标签] [该列数据类型] comment [字段注释], [字段:列标签] [该列数据类型] comment [字段注释], ……&#xff0c…...

大数据及软件教学与实验专业实训室建设方案

一 、系统概述 大数据及软件教学与实验大数据及软件教学与实验在现代教育中扮演重要角色&#xff0c;这方面的教学内容涵盖了大数据处理、数据分析、数据可视化和大数据应用等多个方面。以下是大数据及软件教学与实验的一般内容&#xff1a;1. 数据基础知识&#xff1a;教授学生…...

信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;公式和函数&#xff09; 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用&#xff0c;绝对引用&#xff0c;混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…...

【Apollo】自动驾驶感知——毫米波雷达

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…...

SpringBoot部署到腾讯云

SpringBoot部署到腾讯云 此处默认已经申请到腾讯云服务器&#xff0c;因为本人还没有申请域名&#xff0c;所以就直接使用的ip地址 XShell连接到腾讯云 主机中填写腾讯云的公网ip地址 公网ip地址在下图中找到 接下来填写服务器的用户名与密码 一般centOS用户名为root&#xff…...

Git 设置代理

Git 传输分两种协议&#xff0c;SSH和 http(s)&#xff0c;设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式&#xff0c;可以在Powershell中使用以下命令设置代理&#xff1a; $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…...

基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的机场VIP客户管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…...

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性...

恒运资本:算力概念强势拉升,亚康股份“20cm”涨停,首都在线等大涨

算力概念21日盘中强势拉升&#xff0c;到发稿&#xff0c;亚康股份“20cm”涨停&#xff0c;首都在线、汇金股份涨逾11%&#xff0c;鸿博股份亦涨停&#xff0c;南凌科技涨近9%&#xff0c;科创信息、神州数码、铜牛信息等涨超7%。 音讯面上&#xff0c;8月19日&#xff0c;202…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...