Redis的watch机制详解
WATCH 是 Redis 提供的一个用于实现 乐观锁 (Optimistic Lock) 的命令,通常用于实现事务中的并发控制。它允许客户端监控一个或多个键的变化,并确保事务(MULTI/EXEC)中执行的操作在这些键没有发生改变的情况下才能成功提交。若在事务执行前,某些键被其他客户端修改,事务将被中止,避免潜在的并发修改问题。
WATCH 的工作机制
-
监听键
- 客户端通过
WATCH命令可以监听一个或多个键。执行后,Redis 会将这些键标记为被当前客户端监视的状态。 - 一旦这些被监视的键在
EXEC之前被其他客户端修改(包括DEL,SET,INCR,DECR等操作),事务就会被中止。
- 客户端通过
-
事务的执行
- 在监听键后,客户端会开始一个事务块,使用
MULTI命令,表示事务的开始。 - 然后客户端可以执行一系列 Redis 命令,但这些命令不会立即执行,而是放入事务队列。
- 最终,客户端使用
EXEC命令提交事务,Redis 将检查被WATCH的键在事务执行前是否被修改过。如果没有变化,所有命令将被原子性地执行;如果有任何一个被监视的键被修改,事务会中止,返回nil,表示事务失败。
- 在监听键后,客户端会开始一个事务块,使用
-
取消监视
- 可以通过
UNWATCH命令手动取消监视键。 - 当
EXEC命令执行后,所有WATCH监视的键也会被自动取消。 - 如果客户端在
MULTI/EXEC事务块中使用了DISCARD命令,事务会被取消,且WATCH的效果也会失效。
- 可以通过
使用 WATCH 的例子
# Client A
WATCH mykey
MULTI
INCR mykey
EXEC
假设此时 Client A 在监听 mykey,并准备执行事务。如果 mykey 被 Client B 修改:
# Client B
SET mykey 100
然后 Client A 执行 EXEC,由于 mykey 在 EXEC 之前已经被 Client B 修改,事务会失败,返回 nil。
乐观锁的机制
WATCH 的核心思想是乐观锁机制。与悲观锁不同,乐观锁假设并发操作很少发生,并在操作前先不锁定资源,而是允许多个客户端对数据进行操作和修改。在提交前,通过 WATCH 确保没有其他客户端对数据进行了修改,如果检测到冲突,操作会回滚或者重新尝试。
这种机制特别适用于以下场景:
- 需要在高并发下处理数据的场景。
- 希望通过简洁的方式控制并发修改。
- 对于不确定的并发情况,可以避免频繁加锁的复杂性。
WATCH 与 MULTI/EXEC 的关系
MULTI/EXEC实现的是原子性事务,但没有自动的并发控制机制。WATCH可以与MULTI/EXEC配合,增加对并发修改的检测,确保事务提交时数据不会发生意外变化。
WATCH 的注意事项
-
只监视变化,而不是加锁:
WATCH仅仅是监视键是否发生了变化,不会阻止其他客户端对该键的修改。也就是说,WATCH并不会提供类似于悲观锁的资源保护,只是用来检测冲突。 -
长时间监视代价大:长时间使用
WATCH会增加 Redis 的监视列表大小,并消耗内存资源。因此,监视应该尽量在事务短时间内执行完毕,避免WATCH的持久存在。 -
取消监视:如果
EXEC失败,事务被中止,或者客户端主动取消了监视(使用UNWATCH),应该注意重新开始一个新的WATCH周期。
典型应用场景
- 乐观锁:在数据操作时确保事务中的键没有被其他客户端修改,以避免数据冲突。
- 计数器:例如,对一个计数器的原子性递增操作,确保在高并发下,多个客户端不会发生数据覆盖或丢失问题。
- 库存管理:在电子商务系统中,检查和更新商品库存可以通过
WATCH来确保库存不会被多个客户端同时操作,从而避免超卖问题。
WATCH 的性能与局限性
-
性能:
WATCH的开销与 Redis 的高性能特性结合得很好,它依赖于 Redis 的内存存储和事件驱动模型,能以低开销监视大量的键。 -
局限性:
WATCH是乐观锁的一种形式,对于高并发环境下的冲突,可能需要多个客户端进行重试,这在非常高的并发场景中可能会带来一定的延迟。此外,如果一个事务的执行逻辑复杂,WATCH可能导致频繁的失败重试。
总结
Redis 的 WATCH 机制为 Redis 提供了一种高效的乐观锁解决方案,允许客户端通过监视键的变化来控制并发事务的安全执行。它适用于高并发场景下的事务操作,同时能保持 Redis 的高性能特性。不过,在高冲突环境下,需要结合业务逻辑进行适当的重试或其他并发控制措施。
相关文章:
Redis的watch机制详解
WATCH 是 Redis 提供的一个用于实现 乐观锁 (Optimistic Lock) 的命令,通常用于实现事务中的并发控制。它允许客户端监控一个或多个键的变化,并确保事务(MULTI/EXEC)中执行的操作在这些键没有发生改变的情况下才能成功提交。若在事…...
UnrealEngine 打包Android平台应用
虚幻引擎 支持将项目发布到 安卓(Android) 移动设备上,并且提供了若干功能帮你将项目发布到 谷歌游戏商店。本节包含了如何设置Android开发环境、如何使用Android功能和服务、以及如何为发布游戏做准备相关的指南。 当前SDK要求 当前UE版本…...
Linux:git
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:git》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!!&…...
electron有关mac构建
针对 Mac M1/2/3 芯片的设备,proces.archarm64. 执行下面命令,检查下按照的 node.js 版本是不是 intel x64 指令集,如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令:node -p process.arch 对应的node版本也是arm版 …...
C语言-数据结构 弗洛伊德算法(Floyd)邻接矩阵存储
弗洛伊德算法相比迪杰斯特拉相似的地方都是遍历邻接矩阵不断调整最短路径的信息,并且两种算法面对多源最短路径的时间复杂度都是O(n^3),Floyd采用的是动态规划而Dijkstra是采用贪心的思想。在Floyd中我们将创建两个数组进行辅助,一个path二维…...
pyspark 安装记录
1、安装软件 1、python 3.10 2、hadoop-3.3.4 里面的winutils 要记得添加 3、java-17 4、spark-3.5.1-bin-hadoop3 python 安装 pyspark,Jupyter notebook pip install pyspark pip install jupyter notebook 2、添加环境变量 JAVA_HOME=C:\PySparkService\java-17H…...
高度可定制的电竞鼠标,雷柏VT1 PRO MAX体验
不管是菜鸟还是老鸟,游戏玩到某个阶段很容易出现瓶颈,在游戏的某个阶段,这里面制约最大的除了操作之外,实际上还是我们用的硬件。比如在PC游戏中,鼠标的影响就非常大,像是在游戏中如果鼠标延迟过高…...
经验笔记:SOA(面向服务的架构)
SOA(面向服务的架构)经验笔记 引言 SOA(Service-Oriented Architecture, 面向服务的架构)是一种设计原则,用于构建灵活且可扩展的分布式系统。SOA强调将应用程序的不同功能封装为独立的服务,这些服务通过…...
triton之ttir学习
一 基本语句 1 常量 %cst arith.constant dense<520192> : tensor<4096xi32> %c127_i32 arith.constant 127 : i32 %cst arith.constant dense<520192> : tensor<4096xi32> 解释:这条语句定义了一个名为 %cst 的常量,它…...
如何在AWS账户上进行充值:一份详尽指南
大家好,小编今天给大家带来一份关于如何在AWS账户上进行充值的详尽指南。对于使用AWS服务的用户来说,保持账户余额充足是确保服务不中断的关键。下面,九河云将详细讲解具体的操作步骤。 步骤一:登录AWS管理控制台 首先ÿ…...
(六十四)第 10 章 内部排序(静态链表的插入排序)
示例代码 staticLinkList.h // 静态链表的插入排序实现头文件#ifndef STATIC_LINK_LIST_H #define STATIC_LINK_LIST_H#include "errorRecord.h"#define SIZE 100 #define NUM 8typedef int InfoType; typedef int KeyType;typedef struct {KeyType key;InfoType inf…...
appium历史版本地址链接
appium / Appium.app / Downloads — Bitbucket ios的appium界面图 链接: https://pan.baidu.com/s/1i8BRaZgQA3ImLUhKZjfhiA 提取码: 5c8b...
TCPIP网络编程(尹圣雨)UDP 轮流收发消息(windows)
端口号写的是 2345 客户端 #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib")using std::cout; using std::endl; using std::cin;int main() {WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) ! 0){cout <<…...
【相机方案(2)】V4L2 支持相机图像直接进入GPU内存吗?DeepStream 确实可以将图像数据高效地放入GPU内存进行处理!
V4L2 支持相机图像直接进入GPU内存吗? V4L2(Video4Linux Two)是Linux内核中用于视频捕获和播放的API,它本身并不直接支持将相机捕获的图像数据直接拷贝到GPU内存而不经过CPU内存。V4L2主要关注于视频设备的控制、数据的捕获和播放…...
UEFI——PEI阶段
一、PEI介绍 Pre-EFI Initialization(PEI)在引导的早期被调用,仅利用CPU资源调用PEIM,这些PEIM负责: (1)初始化一些永久内存 (2)在HOBs中描述内存信息 (3…...
Nacos下载和启动
Nacos是什么? 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台 下载 https://github.com/alibaba/nacos/releases/tag/2.1.1启动 将下载好的Nacos解压缩,然后到bin目录下打开cmd 输入指令:startup.cmd -m standalone 出…...
怎么选择适合的服务器
大家都知道,不管是公司还是个人,在数字化浪潮已经席卷全球的环境下,大家对服务器的需求是日渐增长的。很多人在买服务器的时候,多少都有点选择困难,今天我们就来对比下物理服务器和弹性云服务器,看看选哪个…...
通义千问大模型Java调用,百炼
文章目录 一、大模型服务平台[百炼](https://help.aliyun.com/zh/model-studio/getting-started)二、Java sdk调用与eventStream三、百炼平台其它 一、大模型服务平台百炼 百炼是阿里新出的一个大模型服务平台,聚合了多个千问大模型及其它一些大模型的调用…...
新发现!一键管理所有远程会话的神器——1Remote
大家好,今天给大家介绍一款非常实用的工具——1Remote,这是一款现代化的个人远程会话管理器与启动器,让您的远程工作变得更加轻松高效! 项目介绍 🚀 核心功能概览 多协议支持:1Remote支持RDP、SSH、VNC、…...
华为 HCIP 认证费用和报名资格
在当今竞争激烈的信息技术领域,华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力,也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...
