zoukankan      html  css  js  c++  java
  • redis消息订阅、pipeline、事务

    Redis消息订阅

    消息订阅发布模式是一种常用的设计模式,它具有一对多的依赖关系,它有3个角色:主题(Topic)、订阅者(Subscriber)、发布者(Publisher)。简单来说,就是让多个订阅者对象同时监听某个发布者发布的主题对象,当这个主题对象的状态发生变化时,所有订阅者对象都会收到通知,使他们自动更新自己的状态。发布者与订阅者具有一对多的关系,它们之间存在依赖性,订阅者必须订阅主题后才能接受发布者发布的消息,在订阅前发布的消息,订阅者是接受不到的,这就是消息订阅发布模式。

    image-20201006102329182

    #消息发布者将消息发送给指定频道(channel),返回一个整数,表示接收到这条消息的客户端的数量
    PUBLISH channel message
    #客户端订阅指定的消息频道。一旦客户端进入订阅状态,它就不能运行除SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE命令之外的其他命令了。
    SUBSCRIBE channel ...
    #客户端根据指定的模式来订阅符合这个模式的频道。该命令可以重复订阅一个频道,它支持glob风格的模式。
    #1、h?llo:可以订阅hello、hallo和hxllo频道(?表示单个任意字符)
    #2、h*llo:可以订阅hllo和heeeello频道(*表示多个任意字符,包括空字符串)
    #3、h[ae]llo:可以订阅hello和hallo频道,但不能订阅hillo频道(选择[]之间的任意一个字符)
    #如果?、*、[]等符号不是通配符,而只是简单的字符,则需要使用“/”符号进行转义
    PSUBSCRIBE pattern ...
    #客户端根据指定的模式退订符合该模式的所有频道。如果不指定任何模式,则默认退订所有的频道
    PUNSUNSCRIBE [pattern [pattern...]]
    #退订指定的频道。如果没有指定任何频道参数,那么所有已订阅的频道都会被退订。
    UNSUBSCRIBE [channel [channel ...]]
    #PUBSUB命令是一个自检命令,可用于检查发布/订阅子系统的状态。这个命令是由几个子命令组成的
    PUBSUB <subcommand> [argument [argument...]]
    #该命令用于获取模式的订阅数量
    PUBSUB NUMPAT
    

    订阅频道

    当一个客户端执行SUBSCRIBE命令订阅一个或多个频道时,这个客户端与被订阅的频道之间就建立了一种订阅频道关系。这个订阅频道关系将会被保存到服务器状态的pubsub_channels字典里面。这个字典也是一个键值对,字典中的键某个被订阅的频道,而字典中的值就是一个链表,这个链表记录了所有订阅这个频道的客户端。

    image-20201006153337975

    1. subscribe

      subscribe消息表示客户端已经成功的订阅了指定的频道。返回信息的第一个值是subscribe字符串,表示指定的频道订阅成功;第二个值是订阅成功的频道名称;第三个值是目前已经成功订阅的频道数量。

    2. unsubscribe

      unsubscribe消息表示客户端已经成功的取消订阅了指定的频道。返回信息的第一个值是unsubscribe字符串,表示已经成功退订指定的频道;第二个值是要退订的频道名称;第三个值是当前客户端订阅的频道数量。如果第三个值为0,则表示这个客户端没有订阅任何频道。

    3. message

      message消息表示订阅频道的客户端已经成功的收到了另一个客户端向这个频道发送过来的消息。就是消息订阅这成功的收到了消息发布者向频道发送的消息。返回信息的第一个值是message字符串,表示返回值的类型是消息;第二个值是发送消息的频道名;第三个是消息的内容。

    PIELINE(管道)

    nc localhost 6379
    
    echo -e "set key value
     incr key
     get key"|nc localhost 6379
    

    事务

    Redis事务的基本功能是由MULTI、EXEC、DISCARD及WATCH等命令实现。

    • MULTI命令用于启动Redis事务,将客户端置为事务状态。
    • EXEC命令用于提交事务,执行从MULTI到此命令前面的命令队列,此时客户端变成非事务状态。
    • DISCARD命令用于取消事务,命令执行后,将会清空事务队列中的所有命令,并且客户端从事务状态中退出。
    • WATCH命令用于监视键值对,它使得EXEC命令需要有条件的执行,在所有被监视键都没有修改的前提下,事务才能正常被执行。如果这个被监视的键值对发生了改变,那么事务就不会被执行。

    事务的原子性

    Redis事务的原子性说的是,事务一次可以执行多个命令,在开启事务后,多个命令逐个入队,当遇到EXEC命令时,入队的命令会被看作一个整体来执行,Redis服务器对这个整体命令要么全部执行成功,要么全部执行失败。

    当客户端处于事务开启状态时,每进入一条命令,都会返回一个内容名为QUEUED的结果回复,表示这条命令成功进入Redis服务器事务的队列中,这些命令将会在调用执行EXEC命令后执行。

    事务的一致性

    事务的一致性说的是,数据库在执行事务之前是一致的,在执行事务后,不管事务是执行成功还是执行失败,数据库中的数据也应该具有一致性。这里的一致性指的是,数据库从当前状态变为一种新的状态,数据在变化前后符合数据本身的定义和要求,同时不包含非法或无效的脏数据。

    事务的隔离性

    事务的隔离性说的是当有多个用户并发(同时)访问数据库时,比如,同时操作一张数据表,数据库会为每一个用户单独开启一个事务,每个用户的单独事务的之星互不干扰,它们之间相互隔离,实现了在并发状态下执行的事务所产生的结果完全相同。

    事务的持久性

    事务的持久性说的是,当一个事物正确执行完成后,它对数据库的改变是永久性的,不会因为其他操作而发生改变,即使在在数据库遇到故障的情况下,事务执行完成后的操作也不会丢失。

    事务的处理

    事务执行的过程

    1. 使用MULTI命令开启事务
    2. 事务命令入队
    3. 使用EXEC命令执行事务

    当服务器处于非事务状态时,执行命令不管对与错都会返回结果。当客户端开启事务之后,服务器会根据客户端发送过来的不同命令执行不同操作。

    • 当服务器接收到客户端发送过来的命令是MULTI、EXEC、WATCH、DISCARD命令中的任意一个,服务器会立即执行这个命令。
    • 相反,当服务器接收到客户端发送过来的命令是MULTI、EXEC、WATCH、DISCARD命令以外的其它命令时,服务器不会立即执行这个命令,而是将该命令放入一个事务队列中,然后返回QUEUED表示给客户端。

    image-20201006165612851

    悲观锁

    每次去数据的时候都会给这些数据加锁,不让别人用,别人想拿这些数据就会阻塞直到它释放锁、别人获得锁为止

    乐观锁

    每次去数据的时候不会给这些数据加锁,每次更新数据的时候,都会判断一下在此期间有没有别人更新过数据。如果别人更新过这些数据,他就会放弃本次更新。乐观锁比较适用于多读的应用类型,可以提高吞吐量。

    事务的WATCH命令

    WATCH命令就是一个乐观锁。在执行EXEC命令之前,可以使用WATCH命令来监视任意数量的数据库键。当执行EXEC命令时,服务器会检查被WATCH命令监视的数据库键是否至少有一个已经被修改过,如果发现其中的某个数据库键被改过,那么这个事务将会被服务器拒绝执行,并向客户端返回事务执行失败的空回复。

    使用UNWATCH命令可以取消WATCH命令对数据库键的监视。

    image-20201006172550364

  • 相关阅读:
    程序员如何制定自己的一份年度计划
    【Spring入门系列】篇3:再探IOC
    【Spring入门系列】篇2:SpringIOC入门
    【Spring入门系列】篇1:Spring简介
    适配器模式
    java编程思想之正则表达式
    代理模式
    建造者模式
    抽象工厂模式
    工厂方法模式
  • 原文地址:https://www.cnblogs.com/striver20/p/13773960.html
Copyright © 2011-2022 走看看