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

Redis中事务与乐观锁

1. Redis中的事务

Redis中的事务类似于关系型数据库中的事务,但其功能相对较轻量。事务通过以下命令组合实现:
  • MULTI:标记一个事务的开始。
  • 多条命令:在MULTI之后的所有命令会被放入一个队列中,但不会立即执行。
  • EXEC:执行事务队列中的所有命令。
  • DISCARD:取消事务,丢弃队列中的所有命令。

事务的特点:

  • 原子性:事务中的命令要么全部执行,要么全部不执行。当使用EXEC命令时,Redis会一次性执行队列中的所有命令,并且中途不会被打断。
  • 隔离性:在事务执行期间,其他客户端不能看到事务中间的状态,即使事务内的命令未执行完成。
  • 不支持回滚:Redis事务在执行过程中,如果某条命令失败,其他命令仍会继续执行。Redis不会回滚已经执行的命令。

2. 乐观锁

Redis中没有提供直接的锁机制,而是通过CAS(Compare and Set)操作和WATCH命令来实现乐观锁。

乐观锁的实现方式:

  • WATCH:对一个或多个键进行监视。在执行EXEC之前,如果这些键的值发生了变化,事务将被中止。
  • UNWATCH:取消监视。

使用步骤:

  1. 使用WATCH命令监视一个或多个键。
  2. 开启事务(MULTI)并执行一系列命令。
  3. 提交事务(EXEC)。
  4. 如果在WATCH之后,EXEC之前,监视的键被其他客户端修改,EXEC将返回nil,表示事务失败;否则事务将成功执行。

乐观锁的优势:

  • 适合并发环境中读多写少的场景。
  • 避免了使用传统锁带来的性能开销和死锁问题。

3.举例

     此时我想在一个事务中更新多个相关联的键,并希望确保在执行过程中这些键不会被其他客户端修改

WATCH key1 key2
MULTI
SET key1 newValue1
SET key2 newValue2
EXEC

        如果在WATCHEXEC之间,key1key2被其他客户端修改了,EXEC会失败,事务不会执行。这时可以选择重新执行整个操作,确保数据一致性。此时就相当于SQL中的乐观锁功能。


http://www.mrgr.cn/news/14526.html

相关文章:

  • 设计模式之建造者模式
  • 在VB.net中,LINQ有什么方法与属性
  • 代码随想录算法训练营第三十天|452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间
  • Prometheus监控Kubernetes ETCD
  • 这款SpringBoot+Vue酒店管理系统,你绝对值得拥有
  • SpringBoot集成kafka-监听器注解
  • CARLA Drone: 首个实现从不同空中视角进行单目3D目标检测,并提供数据集
  • jvm监控工具一览
  • 【No module named ‘pcapy‘】报错解决方法
  • 公网信息泄露监测(网盘、暗网、搜索引擎、文档平台)思路分享
  • 设计模式之单例模式
  • 算法练习题01:月份天数
  • Wordpress 6.x 修改文件上传大小限制
  • WebRTC支持H.265编码:技术挑战与EasyCVR视频汇聚平台解决方案
  • 企业级web应用服务器之Tomcat
  • git cherry-pick 合并单个提交
  • LeetCode 热题100-10 和为 K 的子数组
  • C++:list篇
  • npm包不满足需求的时候怎么办
  • Android13--移除最近任务长按图标弹出菜单