redis-乐观锁Watch使用方法

一 乐观锁Watch介绍

监控 (Watch):可用于做乐观锁

悲观锁:很悲观,做什么都会加锁(Synchronize关键字就是这样)乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁。获取version
更新的时候比较version

使用watch key监控指定数据,相当于乐观锁加锁。

二 应用场景

  1. 计数器:当多个客户端同时对同一个计数器进行增减操作时,可以使用乐观锁确保操作的原子性和一致性。

  2. 分布式锁:通过 Redis 实现分布式锁时,可以利用 WATCH 命令和事务来实现乐观锁机制,确保在加锁和解锁操作期间,锁的状态没有被其他客户端改变。

  3. 缓存更新:在更新缓存时,可以使用乐观锁来确保缓存的一致性。例如,在更新缓存之前,先 WATCH 缓存对应的键,然后在事务中执行缓存更新操作,如果缓存在 WATCH 之后被其他客户端修改,则事务会失败,可以根据需要进行重试或者其他处理。

  4. 队列操作:在实现分布式队列时,可以利用乐观锁机制来确保队列操作的原子性。例如,在出队操作前先 WATCH 队列键,然后在事务中执行出队操作,如果队列在 WATCH 之后被其他客户端修改,则事务会失败,可以根据需要进行重试或者其他处理。

  5. 数据版本控制:在实现数据版本控制时,可以使用乐观锁来确保数据的一致性。例如,在更新数据时,先获取数据的版本号,然后在事务中执行数据更新操作,如果版本号发生变化,则事务会失败,可以根据需要进行重试或者其他处理。

总的来说,乐观锁在 Redis 中可以用于各种需要并发控制的场景,通过 WATCH 命令和事务机制来确保操作的原子性和一致性,提高系统的并发处理能力和数据的一致性。

三,案例

127.0.0.1:6379> set money 100 # 设置余额:100
OK
127.0.0.1:6379> set use 0 # 支出使用:0
OK
127.0.0.1:6379> watch money # 监视money (上锁)
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY use 20
QUEUED
127.0.0.1:6379> exec # 监视值没有被中途修改,事务正常执行
1) (integer) 80
2) (integer) 20

测试多线程修改值,使用watch可以当做redis的乐观锁操作(相当于getversion)

线程1:

127.0.0.1:6379> watch money # money上锁
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY use 20
QUEUED
127.0.0.1:6379> 	# 此时事务并没有执行


模拟线程插队,线程2:

127.0.0.1:6379> INCRBY money 500 # 修改了线程一中监视的money
(integer) 600

回到线程1,执行事务:

127.0.0.1:6379> EXEC # 执行之前,另一个线程修改了我们的值,这个时候就会导致事务执行失败
(nil) # 没有结果,说明事务执行失败127.0.0.1:6379> get money # 线程2 修改生效
"600"
127.0.0.1:6379> get use # 线程1事务执行失败,数值没有被修改
"0"

解锁获取最新值,然后再加锁进行事务。

unwatch进行解锁。

注意:每次提交执行exec后都会自动释放锁,不管是否成功

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

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

相关文章

Elasticsearch 聚合函数返回空数组|查询返回空内容 rs里有数据

问题场景: 今天用聚合函数想查询出catename不重复列表,类似于Mysql的group by函数。但返回的确是空数组[],再三确认是有数据的。输出response: {"took":1,"timed_out":false,"_shards":{"tot…

WebKit简单介绍

WebKit是一个开源的浏览器网页排版引擎,起源于苹果公司,最初是为了开发Safari浏览器而创建的。WebKit主要包含两个核心组件:WebCore和JavaScriptCore。 WebCore:主要负责解析HTML文档、样式表(CSS)以及处理…

【考研数学】0基础网课汇总+资源分享

选老师千万别跟风! 考研界里的大咖其实真的不少啊!像是汤家凤、张宇、李永乐、武忠祥、王世安、杨超这些老师,都是大神级别的存在!他们每个人都有自己独特的教学风格,只要跟着其中任何一个,认真听讲、做好…

[RK3128-LINUX] 关于 OpenGL ES2 实现画图相关问题

问题描述 在SDK中并没有找到有关OpenGL ES2 实现画图或者刷图的Demo程序,那么该功能如何实现呢? 解决方案: 标准api说明可以参考khronos定义:https://registry.khronos.org/ 相关书籍:《OpenGL超级宝典》、《openGL…

增强函数(Augmentation Function)

增强函数(Augmentation Function)通常用于扩充数据集,通过应用一系列的随机变换来生成新的数据样本。这在机器学习和深度学习中特别有用,因为增加数据的多样性可以帮助模型更好地泛化。下面是一个简单的增强函数的例子&#xff0c…

FFmpeg获取视频详情

话不多说&#xff0c;直接上代码&#xff1a; pom依赖&#xff1a; <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</versi…

linux清理缓存垃圾命令和方法介绍

在Linux系统中&#xff0c;清理缓存和垃圾文件可以通过多种方法完成&#xff0c;这些方法旨在释放磁盘空间、提高系统性能。以下是一些常用的方法&#xff0c;结合了搜索结果中的信息&#xff1a; 1. 使用sync和echo命令清除RAM缓存和交换空间1 清除页面缓存&#xff08;Page …

【c++基础】数池塘(四方向)

说明 农夫约翰的农场可以表示成N*M&#xff08;1≤N、M≤100&#xff09;个方格组成的矩形。由于近日的降雨&#xff0c;在约翰农场上的不同地方形成了池塘。每一个方格或者有积水&#xff08;W&#xff09;或者没有积水&#xff08;.&#xff09;。农夫约翰打算数出他的农场上…

深入理解 Linux 内核链表:C 链表的实用性和优势

深入理解 Linux 内核链表&#xff1a;C 链表的实用性和优势 在 Linux 内核的设计和实现中&#xff0c;链表是一种非常关键的数据结构&#xff0c;尤其是因为它在处理动态数据集合时的高效性和灵活性。本文将深入探讨链表在 Linux 内核中的作用以及内核开发者如何利用 C 语言中…

css 属性值initial、unset、revert

1.initial CSS 关键字 initial 将属性的初始&#xff08;或默认&#xff09;值应用于元素。不应将初始值与浏览器样式表指定的值混淆。它可以应用于任何 CSS 属性。这包括 CSS 简写 all&#xff0c;initial 可用于将所有 CSS 属性恢复到其初始状态。 2.unset CSS 关键字 uns…

【css】使用display:inline-block后,元素间存在4px的间隔

问题&#xff1a;在本地项目中使用【display: inline-block】&#xff0c;元素间存在4px间隔。打包后发布到外网又不存在这个问题了。 归根结底这是一个西文排版的问题&#xff0c;英文有空格作为词分界&#xff0c;而中文则没有。 此时的元素具有文本属性&#xff0c;只要标签…

基于深度学习的肿瘤图像检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;在本博客中&#xff0c;我们深入探讨了基于YOLOv8/v7/v6/v5的肿瘤图像检测系统。核心上&#xff0c;我们采用了最新的YOLOv8技术&#xff0c;并将其与YOLOv7、YOLOv6、YOLOv5算法进行了综合整合和性能指标对比分析。我们详细阐述了当前国内外在此领域的研究现状…

python实现UDP服务器

import socket # 创建UDP socket udp_server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定地址和端口 server_address (localhost, 12000) udp_server_socket.bind(server_address) # 服务器循环 while True: # 接收客户端消息 message, c…

Python机器学习实验 Python 数据分析

1.实验目的 掌握常见数据预处理方法&#xff0c;熟练运用数据分析方法&#xff0c;并掌握 Python 中的 Numpy、 Pandas 模块提供的数据分析方法。 2.实验内容 1. Pandas 基本数据处理 使用 Pandas 模块&#xff0c;完成以下操作。 &#xff08;1&#xff09;创建一个由 0 到 50…

Ai音乐大师演示(支持H5、小程序)独立部署源码

Ai音乐大师演示&#xff08;支持H5、小程序&#xff09;独立部署源码

使用IntelliJ IDEA配置版本管理(SVN和Git)

一&#xff1a;SVN版本管理 步骤一&#xff1a;安装SVN插件 打开IntelliJ IDEA&#xff0c;点击顶部菜单栏的 "File" -> "Settings"。在弹出的窗口中&#xff0c;选择 "Plugins"。在搜索框中输入 "SVN"&#xff0c;找到 "Su…

如何在Python中处理JSON数据?

如何在Python中处理JSON数据&#xff1f; 在Python中处理JSON数据是一个常见的任务&#xff0c;因为JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它易于人阅读和编写&#xff0c;同时也易于机器解析和生成。Python的内置库…

政安晨:【Keras机器学习实践要点】(十五)—— KerasTuner 简述

目录 导言 调整模型结构 定义搜索空间 开始搜索 查询结果 重新训练模型 调整模型训练 调整数据预处理 重新训练模型 指定调整目标 以内置指标为目标 以自定义指标为目标 调整端到端工作流程 将 Keras 代码分开 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1…

Web框架开发-Django-model进阶

一、QuerySet 可切片 使用python的切片语法来限制查询集记录的数目,它等同于SQL的limit和offset子句。 1 2 In [2]: Book.objects.all()[:5] # (LIMIT 5) In [2]: Book.objects.all()[5:10]     # (OFFSET 5 LIMIT 5) 不支持负的索引(例…

漫谈结构体

注意&#xff1a; 1.结构体是自定义数据类型&#xff0c;定义之后使用就跟使用库自带的int这些数据类型一样的。 2.定义结构体类型不会分配内存空间&#xff0c;定义变量才会。 1.匿名结构体&#xff08;声明时创建变量&#xff0c;不然没啥用&#xff09; 匿名结构体是没有定…