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后都会自动释放锁,不管是否成功

相关推荐

  1. redis-乐观Watch使用方法

    2024-04-04 17:24:04       19 阅读
  2. 悲观乐观在django中使用

    2024-04-04 17:24:04       20 阅读
  3. 深入理解Redis事务、事务异常、乐观、管道

    2024-04-04 17:24:04       11 阅读
  4. redis击穿问题使用实现方案

    2024-04-04 17:24:04       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-04 17:24:04       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-04 17:24:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-04 17:24:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-04 17:24:04       18 阅读

热门阅读

  1. python用fastapi快速写一个增删改查的接口

    2024-04-04 17:24:04       15 阅读
  2. Linux内核调试之如何用kdb调试

    2024-04-04 17:24:04       16 阅读
  3. 模板:C++ sort函数

    2024-04-04 17:24:04       18 阅读
  4. 安装nodejs、npm、coturn

    2024-04-04 17:24:04       19 阅读
  5. 2024最新华为OD机试试题库全 -【高效货运】- C卷

    2024-04-04 17:24:04       20 阅读