4.1.3 WATCH命令介绍
本文关键词:Redis入门指南,由笔耕文化传播整理发布。
> 其他综合 > Redis入门指南 4.1.3 WATCH命令介绍 2013-06-14 09:53:18 我要投稿
本文所属图书 > Redis入门指南
本书是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、管道、持久化、优化Re... 立即去当当网订购
我们已经知道在一个事务中只有当所有命令都依次执行完后才能得到每个结果的返回值,可是有些情况下需要先获得一条命令的返回值,然后再根据这个值执行下一条命令。例如,介绍INCR命令时曾经说过使用GET和SET命令自己实现incr函数会出现竞态条件,伪代码如下:
def incr($key)
$value = GET $key
if not $value
$value = 0
$value = $value + 1
SET $key, $value
return $value
肯定会有很多读者想到可以用事务来实现incr函数以防止竞态条件,可是因为事务中的每个命令的执行结果都是最后一起返回的,所以无法将前一条命令的结果作为下一条命令的参数,即在执行SET命令时无法获得GET命令的返回值,也就无法做到增1的功能了。
为了解决这个问题,我们需要换一种思路。即在 GET 获得键值后保证该键值不被其他客户端修改,直到函数执行完成后才允许其他客户端修改该键键值,这样也可以防止竞态条件。要实现这一思路需要请出事务家族的另一位成员:WATCH。WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值),如:
redis> SET key 1
OK
redis> WATCH key
OK
redis> SET key 2
OK
redis> MULTI
OK
redis> SET key 3
QUEUED
redis> EXEC
(nil)
redis> GET key
"2"
上例中在执行WATCH命令后、事务执行前修改了key的值(即SET key 2),,所以最后事务中的命令SET key 3没有执行,EXEC命令返回空结果。
学会了WATCH命令就可以通过事务自己实现incr函数了,伪代码如下:
def incr($key)
WATCH $key
$value = GET $key
if not $value
$value = 0
$value = $value + 1
MULTI
SET $key, $value
result = EXEC
return result[0]
因为EXEC命令返回值是多行字符串类型,所以代码中使用result[0]来获得其中第一个结果。
提示 由于WATCH命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所以我们需要在EXEC执行失败后重新执行整个函数。
执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消监控。比如,我们要实现hsetxx函数,作用与HSETNX命令类似,只不过是仅当字段存在时才赋值。为了避免竞态条件我们使用事务来完成这一功能:
def hsetxx($key, $field, $value)
WATCH $key
$isFieldExists = HEXISTS $key, $field
if $isFieldExists is 1
MULTI
HSET $key, $field, $value
EXEC
else
UNWATCH
return $isFieldExists
在代码中会判断要赋值的字段是否存在,如果字段不存在的话就不执行事务中的命令,但需要使用UNWATCH命令来保证下一个事务的执行不会受到影响。
点击复制链接 与好友分享!回本站首页 您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力 上一篇:4.1.2 错误处理 下一篇:4.2 生存时间 相关文章4.1.3 关系数据库系统的查询优化
1.3.4 命令行工具
4.2.1 命令介绍
4.3.2 SORT命令
2.2.1 mysql命令行
3.1 图形制作的基本命令与相关操作
3.1.1 图形制作的基本命令
1.3.2 命令行参数
2.4.3 调用系统命令执行
2.2.2 基本命令
图文推荐
排行热门
文章 下载 读书
· Win2000下关闭无用端口 · 禁止非法用户登录综合设置 [win9x篇] · 关上可恶的后门——消除NetBIOS隐患 · 网络入侵检测系统 · 潜伏在Windows默认设置中的陷井 · 调制解调器的不安全 · 构建Windows 2000服务器的安全防护林 · SQL Server 2000的安全配置 · Windows优化大师注册机源码 · Aspcode动画教程 · WIN 2000服务器防止ICMP数据包攻击教程 · 实现网络隐身的简单方法 · 手工进行克隆帐号 · 用W32DASM破解网页合并器的密码 · 注册表操作动画教程 · 冰河陷阱v1.2 · 黑客攻防技术宝典:Web实战篇(第2版) · 超级网管员——网络安全 · 代码大全(第二版) · 软件之道:软件开发争议问题剖析 · CSS插件工具箱 · CSS入门经典(第3版) · · CMMI+敏捷整合开发
本文关键词:Redis入门指南,由笔耕文化传播整理发布。
本文编号:232044
本文链接:https://www.wllwen.com/wenshubaike/mishujinen/232044.html