大数据之Redis:watch key 和unwatch
Posted 浊酒南街
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据之Redis:watch key 和unwatch相关的知识,希望对你有一定的参考价值。
1、watch key
在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
2、使用watch
案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功
27.0.0.1:6379> watch balance#检测可用余额数,初始值为100
OK
127.0.0.1:6379> MULTI# 开启事务
ok
127.0.0.1:6379> decrby balance 20#消费20后,可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
1)(integer)80
2)(integer)20
案例二:使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。
```powershell
27.0.0.1:6379> watch balance#检测balance的值,初始为为80
OK
127.0.0.1:6379> MULTI# 开启事务(标注1)
ok
127.0.0.1:6379> decrby balance 20#可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
(nil)#事务失败
127.0.0.1:6379>get balance
"800"
127.0.0.1:6379>get balance #查看balance值
"80"
127.0.0.1:6379>set balance 800 #修改balance值
ok
watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
3、unwatch
取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
4、三特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交(exec)之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题 ;
不保证原子性
Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
以上是关于大数据之Redis:watch key 和unwatch的主要内容,如果未能解决你的问题,请参考以下文章