经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
Redis事务涉及的watch、multi等命令
来源:cnblogs  作者:ImClive  时间:2018/11/1 9:26:16  对本文有异议

Redis Watch 命令

作用:
用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
用法:

  1. redis 127.0.0.1:6379> WATCH key1 key2
  2. OK

Redis Unwatch 命令

作用:
用于取消 WATCH 命令对所有 key 的监视。
用法:

  1. redis 127.0.0.1:6379> UNWATCH
  2. OK

Redis Multi 命令

作用:
用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
用法:

  1. redis 127.0.0.1:6379> MULTI # 标记事务开始
  2. OK
  3. redis 127.0.0.1:6379> INCR user_id # 多条命令按顺序入队
  4. QUEUED
  5. redis 127.0.0.1:6379> INCR user_id
  6. QUEUED
  7. redis 127.0.0.1:6379> INCR user_id
  8. QUEUED
  9. redis 127.0.0.1:6379> PING
  10. QUEUED
  11. redis 127.0.0.1:6379> EXEC # 执行
  12. 1) (integer) 1
  13. 2) (integer) 2
  14. 3) (integer) 3
  15. 4) PONG

利用watch实现incr

  1. 具体做法如下:
  2. WATCH mykey
  3. val = GET mykey
  4. val = val + 1
  5. MULTI
  6. SET mykey $val
  7. EXEC

在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。这样调用者在判断返回值后就可以获悉val是否被重新设置成功。

注意点:

  • 由于WATCH命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所以在一般的情况下我们需要在EXEC执行失败后重新执行整个函数。
  • 执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消监控。

示例:

  1. 打开两个redis-cli命令行窗口 session 1 session 2
  2. session 1:
  3. redis 127.0.0.1:6379> set test 1 # 设置test="1"
  4. OK
  5. redis 127.0.0.1:6379> get test # 获取到test的值为"1"
  6. "1"
  7. redis 127.0.0.1:6379> watch test # 监视test
  8. OK
  9. redis 127.0.0.1:6379> multi # 开启事务
  10. OK
  11. redis 127.0.0.1:6379> set test 2 # 将test设为"2"
  12. QUEUED
  13. redis 127.0.0.1:6379> exec # 待 session 2 执行完毕后再执行 session 1 的exec命令,发现执行失败
  14. (nil)
  15. redis 127.0.0.1:6379> get test # 获取test的值,发现test值为 session 2 中所设置的"3"
  16. "3"
  17. redis 127.0.0.1:6379> unwatch # 取消监视所有key
  18. OK
  19. redis 127.0.0.1:6379> set test 4 # 非事务变更test的值为"4"
  20. OK
  21. redis 127.0.0.1:6379> get test # 获取到test="4"
  22. "4"
  23. session 2:
  24. redis 127.0.0.1:6379> get test # 获取到了 session 1 创建的test="1"
  25. "1"
  26. redis 127.0.0.1:6379> watch test # 监视test
  27. OK
  28. redis 127.0.0.1:6379> multi # 开启事务
  29. OK
  30. redis 127.0.0.1:6379> set test 3 # 将test设为"3"
  31. QUEUED
  32. redis 127.0.0.1:6379> exec # 执行事务
  33. 1) OK
  34. redis 127.0.0.1:6379> get test # 获取到test="3"
  35. "3"
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号