A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-7-4 17:30 编辑

【郑州校区】Redis订阅和发布模式和Redis事务

-------------------Redis订阅和发布模式-------------------
1、概念
    Redis 发布订阅(pub/sub)是一种消息通信模式:
    发送者(pub)发送消息,
    订阅者(sub)接收消息。
    Redis 客户端可以订阅任意数量的频道。

2、subscribe channel:订阅个指定频道的信息

3、publish channel message:将信息message 发送到指定的频道channel

4、应用场景
    1、今日头条订阅号、微信订阅公众号、新浪微博关注、邮件订阅系统
    2、即使通信系统
    3、群聊部落系统(微信群)

5、测试实践:微信班级群 class:20170101
    1、学生C订阅一个主题叫 :class:20170101
        >subscribe class:20170101
    2、学生A针对class:20170101主体发送消息,那么所有订阅该主题的用户都能够接收到该数据。
        >publish class:20170101 "hello world! I am A"
    3、学生B针对class:20170101主体发送消息,那么所有订阅该主题的用户都能够接收到该数据。
        >publish class:20170101 "hello world! I am B"
    展示学生C接受到的A\B同学发送过来的消息信息
        1) "subscribe"
        2) "class:20170101"
        3) (integer) 1
        1) "message"
        2) "class:20170101"
        3) "hello world! I am A"
        1) "message"
        2) "class:20170101"
        3) "hello word! I am B"

-------------------Redis事务-------------------
1、概念:
    redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。

2、事务的两种属性
    1、事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送过来的命令请求所打断。
    2、redis事务是原子。原子意味着要么所有的命令都执行,要么都不执行。

3、事务从开始到执行经历的三个阶段
    1、开始事务:multi
    >multi --- OK

    2、命令入队
    >set "strOne" "hello"
    >set "strTwo" "world"
    >set "strThree" "!"

    3、执行事务:exec
    >exec

4、事务执行是常见错误:
    1、语法错误:语法错误指命令不存在或者命令参数的个数不对。
    2、运行错误:运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键,这种错误在实际执行之前Redis是无法发现的,所以在事务里这样的命令是会被Redis接受并执行的。如果事务里的一条命令出现了运行错误,事务里其他的命令依然会继续执行。
        >multi
        >set key 1
        >sadd key 2
        >set key 3
        >exec
            1) OK
            2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
            3) OK
        >get key --- "3"

5、watch命令:可以监控一个或多个键,一旦其中一个键被修改(或删除),之后的事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)
    >set key 1 --- OK
    >watch key --- OK
    >set key 2 --- OK
    >multi --- OK
    >set key 3 --- QUEUED
    >exec --- (nil)
    >get key --- "2"

    def incr($key):
        watch $key
        $value =GET $key
        if not $value:
            $value = 0
        $value = $value + 1
    MULTI
    SET $key,$value
        resule = EXEC
    return resule[0]
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马