马丁传奇
导航
|
||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
统计
- 随笔 - 64
- 文章 - 0
- 评论 - 31
- 引用 - 0
公告
昵称: 马丁传奇园龄: 6年7个月
粉丝: 33
关注: 0 +加关注
搜索
常用链接
我的标签
- redis(15)
- 中文分词(5)
- 隔行变色 悬停高亮(2)
- svn(2)
- CSS居中(2)
- header(1)
- innodb(1)
- iptables 防火墙 linux ssh 远程管理(1)
- jquery 双击更新(1)
- jsonp 跨域(1)
- 更多
随笔分类
随笔档案
- 2019年11月(1)
- 2019年7月(1)
- 2018年3月(1)
- 2016年4月(1)
- 2014年11月(1)
- 2014年2月(3)
- 2014年1月(6)
- 2013年12月(13)
- 2013年11月(8)
- 2013年10月(10)
- 2013年9月(4)
- 2013年8月(8)
- 2013年7月(7)
最新评论
- 1. Re:MySQL的binlog日志
- 总结的很全!去干净自由的 写博客了
- --NiceCui
- 2. Re:inotifywait命令
- 乱七八糟
- --mystery-V
- 3. Re:MySQL的binlog日志
- 学习了!现在只需要打开浏览器写 SQL 就能一站完成系统开发了:
- --jqueryZ
- 4. Re:MySQL的binlog日志
- 大佬,有个问题想向您请教一下:我用reset logs 命令清除了所有的日志文件,之后我的slave就不在同步了,请问如何解决?
- --今晚Da老虎が
- 5. Re:MySQL的binlog日志
- 此文甚好,点赞!
- --逐梦师
阅读排行榜
- 1. MySQL的binlog日志(122331)
- 2. select case when if 的一些用法(80429)
- 3. SQL中的替换函数replace()使用(79864)
- 4. redis的高级事务CAS(乐观锁)(16324)
- 5. PHP CLI模式开发(11036)
评论排行榜
- 1. MySQL的binlog日志(13)
- 2. 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单(10)
- 3. select case when if 的一些用法(5)
- 4. SQL中的替换函数replace()使用(1)
- 5. redis的高级事务CAS(乐观锁)(1)
推荐排行榜
- 1. MySQL的binlog日志(33)
- 2. 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单(7)
- 3. select case when if 的一些用法(6)
- 4. redis的高级事务CAS(乐观锁)(4)
- 5. SQL中的替换函数replace()使用(3)
redis的高级事务CAS(乐观锁)
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可以同时监控多个键,在监控期间只要有一个键被其它客户端改变,则整个事务回滚。 |
|
posted on 2013-11-09 02:31 马丁传奇 阅读(16324) 评论(1) 编辑 收藏
评论
#1楼 3776789 9/6/2017 5:53:49 PM 2017-09-06 17:53 baiwfg2
表格不错! 支持(0) 反对(0) https://pic.cnblogs.com/face/464165/20180317114208.png 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录 或 注册, 访问 网站首页。 【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】这6种编码方法,你掌握了几个?
【推荐】精品问答:微服务架构 Spring 核心知识 50 问