博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis的高级事务CAS(乐观锁)
阅读量:6906 次
发布时间:2019-06-27

本文共 1760 字,大约阅读时间需要 5 分钟。

hot3.png

Optimistic locking using check-and-set(乐观锁)

乐观锁介绍:
watch指令在redis事物中提供了CAS的行为。为了检测被watch的keys在是否有多个clients同时改变引起冲突,这些keys将会被监控。如果至少有一个被监控的key在执行exec命令前被修改,整个事物将会回滚,不执行任何动作,从而保证原子性操作,并且执行exec会得到null的回复。

乐观锁工作机制:

watch 命令会监视给定的每一个key,当exec时如果监视的任一个key自从调用watch后发生过变化,则整个事务会回滚,不执行任何动作。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令,及客户端连接关闭都会清除连接中的所有监视。还有,如果watch一个不稳定(有生命周期)的key并且此key自然过期,exec仍然会执行事务队列的指令。

客户端1 客户端2 说明
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> get name
"zhangsan"
 
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> get name
"zhangsan"
数据库中两客户端登录,及键初始值。
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr age
QUEUED
redis 127.0.0.1:6379> set name lisi
QUEUED
  此时,客户端1开启事务,并提交队列命令:
1.想要将当前age自增+1运算;
2.将name值改为lisi
  redis 127.0.0.1:6379> incr age
(integer) 11
 
此时,客户端2修改了age值
redis 127.0.0.1:6379> exec
1) (integer) 12
2) OK
redis 127.0.0.1:6379> get name
"lisi"
  此时,客户端1执行队列命令,发现运算之后age不是理想中的11,而是12原因是被其它客户插足抢先给修改了。name值也修改了。这样可能导致数据不一致性...
为了解决这个问题引入“乐观锁”的机制:
     
     
客户端1-引入“乐观锁”机制 客户端2 说明
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> get name
"zhangsan"
 
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> get name
"zhangsan"
数据库中两客户端登录,及键初始值。
redis 127.0.0.1:6379> watch age name
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr age
QUEUED
redis 127.0.0.1:6379> set name lisi
QUEUED
  此时,客户端1用watch命令监视age和name,然后开启事务,并提交队列命令
  redis 127.0.0.1:6379> incr age
(integer) 11
 
此时,客户端2修改了age值
redis 127.0.0.1:6379> exec
(nil)
redis 127.0.0.1:6379> get age
"11"
redis 127.0.0.1:6379> get name
"zhangsan"
  此时,客户端1执行队列命令,由watch监控发现此期间age的值已经被修改过,则让事整个务回滚,不做任何动作。
watch可以同时监控多个键,在监控期间只要有一个键被其它客户端改变,则整个事务回滚。
     

转载于:https://my.oschina.net/u/1266221/blog/846955

你可能感兴趣的文章
我的友情链接
查看>>
从0开始学大数据-Java基础开篇(1)
查看>>
github常用命令总结(一)
查看>>
Intent(意图)
查看>>
Exchange Server 2007迁移Exchange Server 2010 (2) ---前期准备之二
查看>>
翻译:Fast dynamic extracted honeypots in cloud computing --5.CONCLUSION
查看>>
Effective C++: constexpr(during compilation).
查看>>
TCP/IP协议三次握手流程
查看>>
了解Oracle内核代码层的作用
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Java学习笔记1-初始化的顺序
查看>>
开源Xen是如何衰落的?
查看>>
Pivot Table系列之切片器 (Slicer)
查看>>
windows下安装mysql5.6及基本命令
查看>>
jsp的九个内置对象简介
查看>>
用户如何获得***服务---步骤与效果
查看>>
学习沟通技巧--- SOFTEN法则与SOLER法则
查看>>
用户密码重设对EFS的影响
查看>>
基于mdrill的大数据分析
查看>>