如何使用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 sampleKey
num = num + 1
SET sampleKey $num

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

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

WATCH sampleKey
num = GET sampleKey
num = num + 1
MULTI
SET sampleKey $num
EXEC

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

3. 总结

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐