redis是一种内存数据存储系统,可被用作数据库、缓存、消息队列等;以高性能、高并发能力著称;本文分为上下两篇,其中上篇主要着眼于最简单的单机数据库&非事务命令场景,对网络框架相关代码进行走读,阐述redis服务器如何接收来自客户端的连接请求,建立连接并与响应客户端的指令,找到对应的处理代码;下篇主要是尝试编写简单的redis客户端,从最简单的建立连接开始,到和redis-server进行交互,借此加深对上篇阅读代码的理解,并在最后模仿redis-server的连接管理模型,实现一个简单的server demo。更多内容移步作者个人博客
redis是基于事件驱动的单线程应用;事件收集器收集事件(这里主要是网络事件和定时事件)之后,分发到各个模块进行处理(在redis中是找到对应事件的注册回调函数);如下图所示:
本文主要关注于网络事件模块的代码走读,为便于分析,会略过无关的代码和配置。
1. 服务端相关配置
因为后续需要通过修改相关的redis配置信息来配合一些实验,所以先介绍redis相关的一些配置信息:
a) redis通过启动命令redis-server [conf-file-path]命令指定配置文件
b) 若是不指定,则默认使用同目录下redis.conf文件作为配置文件
Redis.conf中和网络相关的配置包括:
a) port:指定监听端口号
b) bind: bind用于配置redis进程监听的IP地址;若是没有配置的话,redis进程会监听机器上的所有的IP
c) protected-mode no/yes: 配置保护模式是否开启
d) timeout::配置client闲置多少秒之后,断开链接;0表示不启用, 为便于调试,实验环境我们不启用这个机制
e) logfile/loglevel: 配置日志文件的路径和等级
f) Maxclients: 表示redis服务器端,能接收的最大链接数
g) requirepass: 配置redis服务的密码
redis-server的网络模块在启动过程中主要完成两块工作:
下面依次进行论述。
redis-server的网络模块在启动过程中主要完成两块工作:
l 解析配置文件和命令行参数,完成初始化工作;
l 根据配置信息,创建要监听的socket,并注册回调;
下面依次进行论述。
a) 解析配置及初始化
如代码所示
b) 创建监听socket并注册事件回调
所有配置信息都被读入到server结构体之后,接口initServer开始创建监听socket并注册回调,代码如下所示:
主要做了以下工作:
主要流程包括:
redis客户端和服务器建立连接之后,即可以通过客户端向redis-server发送命令;执行流程如下所述:
主流程如下:
以上为redis网络交互模块,监听接口注册、连接建立、注册回调以及命令解析与交互的主要流程源码走读;因笔者能力有限,若有疏误欢迎留言指正;
2. https://www.xilidou.com/2018/03/22/redis-event/
3. https://www.runoob.com/redis/redis-pipelining.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。