博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用Redis Watch命令
阅读量:4072 次
发布时间:2019-05-25

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

如何使用Redis Watch命令

使用Redis管理数据,理解如何使用事务存储键值对数据很重要。Redis事务与RDMMS事务有些类似,但也有差异。Redis主要通过几个命令有效管理事务,本文讨论Redis的Watch命令以及如何使用。

1. 概述

在阅读之前你最好安装好Redis环境,熟悉Redis常用命令。
Redis事务命令主要包括 WATCH, EXEC, DISCARD, MULTI。这些命令构成一组命令块,确保在一个步骤中全部执行。首先,它们确保事务中的命令将按顺序执行并序列化。这意味着在执行Redis事务时,来自不同客户端的请求不会被服务器接受处理。此外,Redis事务保证是原子的,即要么执行所有的命令,要么不执行。

了解了Redis事务机制后,我们继续看如何使用命令实现事务。

Redis事务使用MULTI命令启动,其总是返回OK。这时用户可以执行多条命令,Redis在队列中加入这些命令,当用户执行EXEC命令时才真正执行队列中的命令。如果用户执行DISCARD命令,Redis丢弃队列中的命令结束事务。

2. Watch命令

前节我们从顶层介绍了Redis的事务及操作过程。本节主要讨论Redis Watch 命令以及其在事务中扮演的角色。
Watch 命令是Exec命令的执行条件;也就是说,如果Watch的Key没有被修改则Redis执行事务,否则(Watch的key被其他事务修改了)事务不会被执行。
Watch 命令可以被调用多次,一个Watch 命令可以监控多个key。Watch 命令调用即启动监控功能,从Watch 命令开始点到执行EXEC命令终止。一旦EXEC被调用,所有的键都将不被监视,无论所讨论的事务是否被中止。关闭客户端连接也会触发所有的键被取消监视。

Redis Watch 命令给事务提供check-and-set (CAS) 机制。被Watch的Key被持续监控,如果key在Exec命令执行前有改变,那么整个事务被取消,Exec返回null表示事务没有成功。

请看下面示例,我们需要给key的值加一,使用下面命令:

num = GET sampleKeynum = num + 1SET sampleKey $num

上面命令在单用户执行环境下没有任何问题。如果多个用户尝试同时正键的值会产生问题,假设sampleKey 原来值为13,两个客户端尝试同时增加值。两者都将键设为14,最终结果为14而不是15。

使用watch命令可以解决该问题:

WATCH sampleKeynum = GET sampleKeynum = num + 1MULTISET sampleKey $numEXEC

使用上面代码,如果竞争条件发生,因为键被监控,Exec会执行失败。只有当没有竞争条件时才能正确执行事务。这种锁处理也称为“乐观锁”,它提供有效昂是保障竞争条件。大多数情况下不同客户端访问不同的键,因此冲突的概率相当小,事务不太可能需要重复执行。

3. 总结

事务是Redis的基本组件,学习如何有效使用很重要。 EXEC, WATCH, MULTI, DISCARD 命令作为实现事务机制的基本命令,管理事务执行保证数据完整性。本文主要介绍Watch命令及如何使用该命令,希望对对理解Redis事务有帮助。

转载地址:http://rcrji.baihongyu.com/

你可能感兴趣的文章
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
android 代码实现圆角
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
Visual Studio 2010:C++0x新特性
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
Encoding Schemes
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
linux和windows内存布局验证
查看>>