专栏首页源码阅读redis代码走读与编程实践——网络交互篇(下)
原创

redis代码走读与编程实践——网络交互篇(下)

,导语

在文章《redis代码走读与编程实践——网络交互篇(上)》中,对redis连接请求与建立流程进行源码剖析和走读;本文主要尝试编写一个简单的redis客户端和redis-server进行连接和交互,借此加深对上文源码走读的理解,更多内容移步作者个人博客。为便于理解和组织文章,实验分为三个部分:

连接建立实验。

命令交互实验。

模拟redis机制实现的简单server的demo。

简单的连接实验

本实验通过简单的单线程的同步交互方式,与redis-server建立连接;过程不涉及redis的命令交互,同时验证redis的最大连接和保护模式配置。

所谓最大连接配置,是指redis支持配置最大连接数,当连接数达到最大连接数时,不再接收新的连接请求;对应配置文件的maxclients配置项。

所谓保护模式配置,是一种保护机制,当保护模式开启时,若是redis-server没有配置密码,则只接收本机IP地址的连接请求,即127.0.0.1的源IP连接请求。

实验源码如下:

最大链接配置如下:

配置最大连接数为1当同时打开两个客户端,后入的客户端运行之后报错:

对应源码:

保护模式配置如下:

对于开启保护模式,不配置密码的场景下;使用客户端直接链接上去,服务端返回错误信息为为:

验证之前的说明,开启保护模式下,若不配置密码,为了避免redis-server暴露在外网环境下,只允许本机连接;对应源码:

简单的命令交互实验

前文在走读redis源码,我们可以分析出客户端请求redis的源码格式,以set指令为例,我们输入set aaa bbb的时候,实际客户端发给服务器的命令内容为:*3\r\n$3\r\nset\r\n$3\r\naaa\r\n$4\r\nbbb\r\n;其中:

  1. *,是普通指令标识
  2. 3,是参数个数
  3. \r\n是分隔符
  4. $3是字符串长度

源码如下所示:

运行结果:

可见数据是成功写入到redis服务器端了

前文说到,redis协议规定,bulk之间使用\r\n进行分割,但是在代码中没有作相应的校验,只是单取\r进行分割,为了验证这个问题,我们将代码中的\n替换为\t如下图所示:

重新编译,运行,结果如下:

是成功的,说明是可以正常写入的。

需要说明的是,这个客户端只针对set命令做了简单的实现,没有实现解码的部分;所以是一个演示功能代码。

基于epoll的server demo

学习源码,不仅是去看开源项目底层的具体实现;更重要是是学习开源项目优秀的设计思想,为后续的项目开发助力;redis网络交互模块是基于epoll机制实现的连接管理,在本节我们模仿redis-server的连接管理机制,实现一个简易的多链接服务器。

首先简单介绍一下epoll:

众所周知,epoll相对于select,能处理更多的连接并且提供更高的性能;具体是通过以下几点做到的:

  1. epoll需要关注的fds,是通过mmap存放在内核态与用户态都可见的位置,避免了epoll-wait时用户态和内核态之间的内存拷贝;
  2. epoll底层使用红黑树管理fds列表,相比于顺序查询提供了更高的增删查改的性能;
  3. epoll-wait返回的是已经就绪的fds列表,主调接口不必遍历所有的fd收集事件;
  4. epoll-wait在收集已经就绪的fd列表的时候,也不是遍历监控的fd,而是让已经就绪的fd自己插入到就绪列表,减少了无意义的遍历行为;

介绍完epoll的原理,server-demo源码如下:

主要包括以下几点:

  1. aeEventElem:用于描述所有被监控的fd,包括关注的事件(mask)、对应的回调(rfunc/wfunc)、以及连接对应的session数据(privdata)
  2. aeEventPool:用于管理所有的需要监控的FD(eventList),fd的值作为eventlist的下标
  3. 接口:aeAddFileEvent用于注册fd事件被触发时的的回调
  4. 因此,主流程里面,首先创建epoll实例,然后创建监听socket,将监听socket事件被触发的回调aeAcceptSocket通过adAddFileEvent注册到aeEventPool中&通过epoll_ctl注册到epoll实例中;然后轮询调用epoll_wait,若有事件发生,被触发的事件存放在events数组中,我们通过event的fd找到对应回调;若是监听接口,则分配连接,并注册连接回调;若是其他接口,则直接读取数据即可

参考资料

1. https://redis.io/

2. https://www.xilidou.com/2018/03/22/redis-event/

3. https://www.runoob.com/redis/redis-pipelining.html

4. https://cloud.tencent.com/developer/article/1005481

5. http://blog.chinaunix.net/uid-28541347-id-4238524.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • redis代码走读与编程实践——网络交互篇(上)

    redis是一种内存数据存储系统,可被用作数据库、缓存、消息队列等;以高性能、高并发能力著称;本文分为上下两篇,其中上篇主要着眼于最简单的单机数据库&非事务命令...

    王鹏程1990
  • Redis源码走读及编程实践——数据安全篇(一)

    redis作为内存数据库,为了防止因为程序bug或者机器故障导致的数据丢失,redis采取了多维度的措施来保障redis写入数据的安全。从单机层面:采取备份磁盘...

    王鹏程1990
  • Redis源码走读及编程实践——数据安全篇(二)

    《Redis源码走读及编程实践——数据安全篇(一)》介绍了RDB的落地原理并走读了redis的RDB落地流程,本文继续介绍redis的另外一种数据落地机制AOF...

    王鹏程1990
  • 有了它,Redis不再是你技术面试中的阻碍

    Redis在互联网技术存储方面使用非常广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对求职小伙伴们进行各种刁难,特别是那些优秀的、竞争激烈的大型...

    博文视点Broadview
  • BATJTMD,大厂招聘,都招什么样Java程序员?

    最近总看到类似这样的问题,也有一些工作3年左右的小伙伴问小傅哥,该怎么进大厂。其实你说 Java 学多少可以找到工作,主要看你想在哪个城市找、找什么样的公司、找...

    小傅哥
  • 进BAT这些互联网大厂,面试之前刷几百道面试题真的有用吗?

    面试之前先刷几篇面经,或者做几道热门面试题,想必是大家很熟悉的一种复习方式了,就像我们当年经常做五年高考三年模拟一样。但是可不要把面试题和面经当成你的主要复习...

    美的让人心动
  • 校招进大厂,分享 Tom哥的读书单

    大家好,我是Tom哥。校招进阿里,研究生,P7技术专家,出过专利,竞赛拿过奖,CSDN博客专家,负责过电商交易、社区生鲜、营销、金融等业务,多年团队管理经验,爱...

    微观技术
  • 必看!java后端,亮剑诛仙(最全知识点)

    你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了...

    xjjdog
  • 基于实践:一套百万消息量小规模IM系统技术要点总结

    本文由公众号“后台技术汇”分享,原题“基于实践,设计一个百万级别的高可用 & 高可靠的 IM 消息系统”,原文链接在文末。由于原文存在较多错误和不准确内容,有大...

    JackJiang
  • 【Rust日报】 2019-05-14:Rust中哪些特性是零开销抽象的

    Snips(一家做音频识别的创业公司) 出品。在神经网络领域,现在基本已经被 TensorFlow 和 PyTorch 给占了。但是对于移动设备或IoT这些性能...

    MikeLoveRust
  • 《后端成长路线》系列 导航篇

    1、在CSDN这么久了,也是有感情的。很感谢这么多粉丝们关注了我,我想,是要回报一下大家的。所以我的博客也是比较用心的,大家可以看出来吧,几乎每周我都会 “排水...

    看、未来
  • 【真荐书】双11书单,我们一起共读 36 + 1 本书

    《Redis开发与运维》全面讲解 Redis 基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后...

    kirito-moe
  • 从Java小白到收获BAT等offer,分享我这两年的经验和感悟

    常想,人生最有趣莫过于前路未知。于是我常常羡慕那些个“金梁古温”笔下随遇而安、随性而为、随缘而爱的浪子们。比如陆小凤,比如叶开。

    猿天地
  • 2021 最新的Java 后端学习路线!凎!

    断断续续写了大半个月,终于把 2021 最新版的 Java 后端学习路线给整完了!

    Guide哥
  • 从Java小白到收获BAT等offer,分享我这两年的经验和感悟

    我写过很多篇秋招总结,这篇文章应该是最后一篇总结,当然也是最完整,最详细的一篇总结。秋招是我人生中一段宝贵的经历,不仅是我研究生生涯交出的一份答卷,也是未来职业...

    程序员黄小斜
  • 长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践

    本文由石墨文档技术杜旻翔分享,原题“石墨文档 Websocket 百万长连接技术实践”,有修订。

    JackJiang
  • 学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

    为什么要学 Linux 呢?因为在实际的开发工作中,项目基本上都要部署到 Linux 环境下。Windows 作为服务器的很少,除了慢没别的原因。

    AI码师
  • Redis 深度历险:核心原理与应用实践

    Redis 是互联网技术架构在存储系统中使用最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的、竞争激烈的大型互联...

    Bug开发工程师
  • 程序员技术练级攻略

    月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programm...

    小小科

扫码关注云+社区

领取腾讯云代金券