概述
hiredis的pipeline实现
使用方式
发送命令
通过连续调用
redisAppendCommand(context, cmd)
将命令拼接成一个长字符串,这个字符串包含所有的命令,且符合redis协议。
字符串拼接过程,如果原字符串空间不足了,就会触发内存再分配和拷贝动作。这是由sds.c完成的。
获取结果
通过反顺序调用
redisGetReply(context, reply)
获取对应cmd的reply
redisGetReply(context, reply)内部实现如下:
- 看看是否在context包含的buf中有reply可以get,如果有读取一个。这里一定是因为buf中的数据符合redis协议,n个reply以特定格式连在一起,因此每次可以get一个。如果有reply get,则返回成功,否则进入下一步2
- 以阻塞方式从fd读取replys,并存储在context包含的buf中,并取出一个reply,然后返回。
c++ redis-client 对pipeline的封装
- 没有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的封装
- 没有cluster的情况
2. 有cluster的情况
除了上述动态数组,还需要为每个sub pipeline准备一个数组,数组中存储cmd的全局顺序。
3.为了统一1,2, 考虑将1当作2的特例,即自有一个sub pipeline的情况,也增加一个数组。
转载于:https://www.cnblogs.com/mjohh/p/5440077.html
最后
以上就是淡定蚂蚁为你收集整理的hiredis pipeline 实现细节以及两种封装的全部内容,希望文章能够帮你解决hiredis pipeline 实现细节以及两种封装所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复