hiredis pipeline 实现细节以及两种封装

hiredis的pipeline实现
使用方式
发送命令
通过连续调用 
redisAppendCommand(context, cmd)
将命令拼接成一个长字符串,这个字符串包含所有的命令,且符合redis协议。
字符串拼接过程,如果原字符串空间不足了,就会触发内存再分配和拷贝动作。这是由sds.c完成的。
 
获取结果
通过反顺序调用
redisGetReply(context, reply)
获取对应cmd的reply
redisGetReply(context, reply)内部实现如下:
  1. 看看是否在context包含的buf中有reply可以get,如果有读取一个。这里一定是因为buf中的数据符合redis协议,n个reply以特定格式连在一起,因此每次可以get一个。如果有reply get,则返回成功,否则进入下一步2
  2. 以阻塞方式从fd读取replys,并存储在context包含的buf中,并取出一个reply,然后返回。
c++ redis-client 对pipeline的封装
  1. 没有cluster的情况
      c++ redis-client抽象出了cmd对象,每个cmd对象包含命令字符串、返回值buf等。使用pipeline时,将cmd对象依次压人pipeline。然后调用pipeline 的flush接口,将命令发送给server。flush接口内部则是依次调用redisAppendCommand(),最后反向调用redisGetReply(),将reply一次保存在cmd对象自己的buf中,再提供一个fetchreply接口,依次从cmd的buf中取结果。
 
    2. 有cluster的情况
    一个pipeline中的cmd将根据由key所属的slot,拆分成多个pipeline,每个pipeline按照1.中的方式执行。要注意的是,由于cmd的执行顺序被打乱了,因此需要保存cmd压人pipeline的次序,以供fetchreply使用。
 
ccredis client 对pipeline的封装
  1. 没有cluster的情况

      由于不打算抽象出cmd对象,可以设计一个动态数组,存储cmd顺序和返回对象的地址。结果正向压入反向取出。

     2. 有cluster的情况
     除了上述动态数组,还需要为每个sub pipeline准备一个数组,数组中存储cmd的全局顺序。
     3.为了统一1,2, 考虑将1当作2的特例,即自有一个sub pipeline的情况,也增加一个数组。

原文链接: https://www.cnblogs.com/mjohh/p/5440077.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    hiredis pipeline 实现细节以及两种封装

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/232583

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午3:33
下一篇 2023年2月13日 下午3:33

相关推荐