Redis 中乐观锁的实现

本文介绍了Redis中乐观锁的实现方式,通过使用WATCH命令监控指定的key,并在事务执行前检查这些key是否发生变化来确保数据的一致性。文章还对比了乐观锁与悲观锁的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 中乐观锁的实现

乐观锁与悲观锁

乐观锁与悲观锁是锁的两种不同的实现思路,乐观锁倾向于假定程序的运行不存在线程问题,在更新数据的时候先去看一下有没有人更改过数据,等数据更改后再来加锁。悲观锁与此相反,其假定程序的运行一定会出现线程问题,所以在执行指令之前,先加锁。

Redis 中的乐观锁

Redis 中的乐观锁是通过 WATCH 命令来实现的。WATCH 指令可以监视一个或多个 key,可以在事务开始之前为 key 添加 watch,若在事务执行之前监控的 key 发生了变化,则事务将会被中断。

WATCH 基本操作

  1. 单客户端正常执行事务

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> watch money # 监控 money
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> SET money 1000
    QUEUED
    127.0.0.1:6379> SET spend 0
    QUEUED
    127.0.0.1:6379> DECRBY money 10
    QUEUED
    127.0.0.1:6379> INCRBY spend 10
    QUEUED
    127.0.0.1:6379> EXEC # 期间没有任何其他的操作,所以正常执行,与此同时监控自动关闭
    1) OK
    2) OK
    3) (integer) 990
    4) (integer) 10
    127.0.0.1:6379> watch money
    OK
    127.0.0.1:6379> unwatch # 手动关闭监控,这里不能追加 key,直接关闭整个监控
    OK
    
  2. 执行事务期间出现其他客户端干扰

    1. 客户端 1: 开启监控和事务
    127.0.0.1:6379> watch money
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> DECRBY money 90
    QUEUED
    127.0.0.1:6379> INCRBY spend 90
    QUEUED
    
    1. 客户端 2: 改变 money 的值
    127.0.0.1:6379> DECRBY money 100
    (integer) 890
    
    1. 客户端 1: 执行事务失败
    127.0.0.1:6379> EXEC # 失败,与此同时监控自动关闭
    (nil)
    

总结

Redis 是通过 watch 指令来添加乐观锁,其原理与 Java 和 mySQL 的原理类似,都是通过一个版本号的概念,在事务执行之前,判断所监视 key 的版本号是否有变化,若无变化,执行事务,若有变化,事务中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值