redis设计与实现(二):订阅与事务

本文深入探讨Redis的发布订阅功能,包括频道订阅与模式订阅的实现原理,以及退订机制。同时,详细解析Redis事务的运作方式,涵盖multi、exec、watch等命令的使用与事务执行流程。

1. 发布与订阅功能

  频道订阅与发布    

        订阅频道
                Redis创建了订阅字典结构来保存频道和订阅客户端之间的关系。字典的键则是被订阅的频道,值则是一个链表结构,存储订阅该频道的客户端。


               **订阅的两个类别**:
                      1.当订阅字典中有这个频道时,则直接将订阅客户端添加至链表的末端
                      2.当订阅字典中没有个频道时,redis直接创建这个键,并创建空的链表结构。将正在创建的客户端添加至链表结构。

       退订频道
          unsubscribe命令是作为退订的。
          退订的逻辑和订阅的逻辑是相反的,没啥好讲的了。

  模式订阅与退订

      模式订阅数据结构图


        这个结构是一个链表结构,链表单元由订阅的客户端client和被订阅的模式pattern组成。
          订阅的模式psubscribe
                  1.创建一个链表单元,设置链表单元的订阅客户端和被订阅的模式。
                  2.将链表单元添加到链表结构尾端
          退订的模式punsubscribe
               将对应的链表单元删除    
          

2.事务

   redis事务:事务提供了一种将多个命令请求打包,然后一次性或者按顺序的执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去其他客户端的命令请求,它会将事务中所有命令都执行完毕才会去处理客户端的命令请求。

    命令:multi:开启事务,

               exec:执行事务,

               watch:

  事务的实现

       multi命令将客户端切换为事务状态

如图:当命令进来,先判断客户端是否出于事务中,不在,执行命令并返回执行结果。

            在客户端在事务中,判断是否是这四种命令,是,则执行命令并返回结果

           不是这四种命令,将命令放入事务队列中,并且执行返回给客户端。

exec命令的实现原理:

#伪代码
def exec(){
    #创建空白的回复队列
     reply_queue = [];
     
     #遍历事务队列的每一个项
     for arg in mstate.command{
        
        #执行命令,并获取返回值
        reply = execute_command(arg);
        reply_queue.add(reply)
        }    
        
       #移除客户端的事务标识,切换为非事务状态
       client.flag = !REDIS_MULTI
       
       #清空事务队列状态 1.清除命令计数器 2.释放事务队列
       client.mstate.count = 0;
       release_transaction_queue(client.mstate.commmand)
       
       #返回事务执行结果给客户端
       send_exec_result_client(client, reply_queue)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值