• Redis的消息订阅及发布及事务机制


    Redis的消息订阅及发布及事务机制

    订阅发布

    SUBSCRIBE PUBLISH

    订阅消息队列及发布消息。

    # 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅
    # SUBSCRIBE 订阅一个频道,如果频道不存在 就新增一个
    # 返回参数 表示 第一个是命令 第二个是频道名称 第三个表示当前订阅该频道的数量
    127.0.0.1:6379> SUBSCRIBE  mychannel
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "mychannel"
    3) (integer) 1
    
    # 在另外一个shell窗口 进行消息发布
    127.0.0.1:6379> PUBLISH mychannel "hello world"
    (integer) 1
    
    # 在回到之前的shell 窗口 我们可以看到消息已经被订阅成功了
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "mychannel"
    3) (integer) 1
    # 下面是本次接受到消息
    1) "message"
    2) "mychannel"
    3) "hello world"
    

    UNSUBSCRIBE

    UNSUBSCRIBE:取消订阅。

    # 第三个返回值表示当前没有订阅者订阅该频道
    127.0.0.1:6379> UNSUBSCRIBE mychannel
    1) "unsubscribe"
    2) "mychannel"
    3) (integer) 0
    

    PSUBSCRIBE PUNSUBSCRIBE

    根据通配符进行订阅户或者取消订阅。

    127.0.0.1:6379> PSUBSCRIBE my*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "my*"
    3) (integer) 1
    # 在另外一个Shell发布消息
    127.0.0.1:6379> PUBLISH mychannel "hello world"
    (integer) 1
    127.0.0.1:6379> PUBLISH mynewchannel "hello world new"
    (integer) 1
    # 此时第一个Shell窗口就可以到如下的订阅消息
    1) "pmessage"
    2) "my*"
    3) "mychannel"
    4) "hello world"
    1) "pmessage"
    2) "my*"
    3) "mynewchannel"
    4) "hello world new"
    

    事务

    Redis支持事务,是基于4个基本指令。

    • MULTI 开启事务
    • EXEC 执行事务
    • DISCARD 放弃事务
    • WATHC 监控

    MULTI EXEC

    MULTI命令开启一个事务,执行MULTI之后,客户端可以向服务器发送多条指令,这些指令不会立即执行,而是被放入队列中,当执行EXEC时,队列中的所有命令才会被执行。

    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> INCR age
    QUEUED
    127.0.0.1:6379> INCRBY age 3
    QUEUED
    127.0.0.1:6379> EXEC
    1) (integer) 1
    2) (integer) 4
    127.0.0.1:6379> get age
    "4"
    127.0.0.1:6379> del age 
    (integer) 1
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set age 18
    QUEUED
    127.0.0.1:6379> INCR age
    QUEUED
    127.0.0.1:6379> INCRBY age 3
    QUEUED
    127.0.0.1:6379> EXEC
    1) OK
    2) (integer) 19
    3) (integer) 22
    127.0.0.1:6379> get age
    "22"
    127.0.0.1:6379> 
    

    事务中错误的情况

    • 如果是入队的时候就报错,那么即使在输入EXEC指令,事务也不会执行。
    • 如果是入队成功,但是执行的时候报错,那么会执行正确的指令,错误的会被跳过,不会终止事务。
    ## 事务中出现错误的情况 入队错误 事务不执行
    127.0.0.1:6379> get age
    "22"
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> INCR age
    QUEUED
    # 写错指令 出现错误提示
    127.0.0.1:6379> INCR age 3
    (error) ERR wrong number of arguments for 'incr' command
    127.0.0.1:6379> EXEC
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> get age
    "22"
    
    ##  事务中出现错误的情况 入队正确 执行错误 事务正常执行
    127.0.0.1:6379> get age
    "22"
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> INCR age
    QUEUED
    127.0.0.1:6379> INCRBY age abc
    QUEUED
    127.0.0.1:6379> INCRBY age 4
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 23
    2) (error) ERR value is not an integer or out of range
    3) (integer) 27
    127.0.0.1:6379> get age
    "27"
    

    由第二错误示例可以看到,Redis的事务是不支持回滚的。这是因为Redis考虑到是失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,另外Redis不支持回滚能够保持Redis 的内部可以保持简单且快速。

    DISCARD

    放弃事务。

    127.0.0.1:6379> get age
    "22"
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> INCR age
    QUEUED
    127.0.0.1:6379> DISCARD
    OK
    127.0.0.1:6379> get age
    "22"
    

    WATCH

    Redis中的CAS操作。WATCH 使得 EXEC 命令需要有条件地执行: 事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。当执行EXEC指令后,对key的WATCH会被取消。

    ​ 被 WATCH 的键会被“监控”,如果有任意一个或多个被监视的键在 EXEC 执行之前被修改了, 整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

    # 第一个窗口
    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> WATCH age
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set age 19
    QUEUED
    # 在第二个窗口 设置
    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> get age
    "20"
    # 在第一个窗口执行事务 因为age已经被更改了,所以本次事务执行失败
    127.0.0.1:6379> EXEC
    (nil)
    
    
    ## 被监控的Key没有变化时 事务可以正确执行
    127.0.0.1:6379> get age
    "20"
    127.0.0.1:6379> WATCH age
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set age 25
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    127.0.0.1:6379> get age
    "25"
    

    以上就是Redis中订阅发布及事务的的常用操作指令了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。

  • 相关阅读:
    详解Java动态代理机制(二)----cglib实现动态代理
    详解Java动态代理机制
    struts2标签库----控制标签详解
    Struts2框架的基本使用(三)
    详解Java反射机制
    Struts2框架的基本使用(二)
    Struts2框架的基本使用
    Servlet3.0新特性(从注解配置到websocket编程)
    使用Java注解来简化你的代码
    ios 跟踪UITextField更改的简单方法
  • 原文地址:https://www.cnblogs.com/enjoyitlife/p/11972110.html
Copyright © 2020-2023  润新知