目录前言1. 命令请求的执行过程1.1 发送命令请求1.2 读取命令请求1.3 命令执行器(1):查找命令实现1.4 命令执行器(2):执行预备操作1.5 命令执行器(3):调用命令的实现函数1.6 命令执行器(4):执行后续工作1.7
参考资料:《Redis设计与实现 第二版》;
第二部分为单机数据库的实现,主要由以下模块组成:数据库、持久化、事件、客户端与服务器;
本篇将介绍 Redis 的服务器端,从服务器接收客户端的命令请求、serverCron 函数以及初始化服务器三个角度介绍;
argv
与 arGC
属性;argv[0]
参数,在命令表中查找参数所指定的命令,并将找到的命令 redisCommand
保存到客户端状态的 cmd
属性里;redisCommand
的主要参数:name
(名字),proc
(函数指针),arity
(命令参数个数),sflags
(命令属性标识),flags
(sflags的二进制标识),calls
(服务器总共执行了多少次这个命令),milliseconds
(执行该命令的总耗时);检查客户端状态的 cmd
指针是否指向 NULL
,是则返回错误;
根据 cmd
指向的 redisCommand
结构的 arity
属性检查参数个数是否正确,不正确则返回错误;
检查客户端是否通过身份验证,未通过的只能执行 AUTH 命令;
若服务器打开了 maxmemory
功能,则在执行命令之前先检查服务器内存占用情况,在需要时回收内存。内存回收失败返回错误;
等等……
client->cmd->proc(client)
;redisCommand
结构的 milliseconds
属性,同时将 calls
属性加一;当客户端套接字变为可写状态时,服务器会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送给客户端 {+OK };
当命令发送完毕后,回复处理器会清空客户端状态的输出缓冲区,为处理下一个命令请求最准备;
serverCron
函数默认每隔 100ms 执行一次,负责管理服务器资源与保持服务器自身良好运转;
下面是 serverCron
函数所做操作的介绍:
更新服务器时间缓存:更新服务器状态的 unixtime
(秒级) 属性和 mstime
(毫秒级) 属性。精度不高,用于:打印日志、更新 LRU 时钟、决定是否执行持久化任务、服务器上线时间等;
更新 LRU 时钟:更新服务器状态的 lruclock
(10秒更新一次) 和 lru
属性。前者用于计算键的空转时间,后者保存了对象最后一次被命令访问的时间。空转时间=lruclock-lru;
更新服务器每秒执行命令次数:调用 trackOperationsPerSecond
函数。以抽样计算的方式,估算并记录服务器在最近 1s 处理的命令请求数量;
更新服务器内存峰值函数:更新stat_peak_memory
属性。该属性记录了服务器的内存峰值大小;
处理 SIGTERM 信号:在启动服务器时,Redis 会为服务器进程的 SIGTERM 信号关联处理器 sigtermHandler 函数,信号处理器负责在服务器接到 SIGTERM 信号时,打开服务器状态的 shutdown_asap 标识;
管理客户端资源:调用 clientsCron
函数。如果客户端与服务器之间的连接已经超时,则释放客户端。如果客户端输入缓冲区大小超过一定长度,则释放客户端当前的输入缓冲区,并创建一个默认大小的输入缓冲区;
管理数据库资源:调用 databasesCron
函数,删除过期键,对字典进行收缩操作;
执行被延迟的 BGREWRITEAOF:检查在执行 BGSAVE 命令期间,是否有 BGREWRITEAOF 命令被延迟执行;
检查持久化操作的运行状态:检查 rdb_child_pid
(记录 BGSAVE 命令的子进程 ID) 属性与 aof_child_pid
(记录执行 BGREWRITEAOF 命令的子进程 ID) 属性。值为 -1 说明服务器没有进行持久化操作;
将 AOF 缓冲区中的内容写入 AOF 文件:如果服务开启 AOF 功能,并且 AOF 缓冲区里有待写入数据,则将 AOF 缓冲区中的内容写入 AOF 文件里;
关闭异步客户端:关闭输出缓冲区大小超过限制的客户端;
增加 cronloops 计数器的值:对服务器状态的 cronloops
属性增 1;
struct redisServer
结构体;redis.c/initServerConfig
函数完成,该函数的主要工作有:
server
变量相关属性的值进行修改;redis-server --port 10086
;redis-server redis.conf
。并且 redis.conf
文件里包含以下内容:# 将数据库数量设置为32个
database 32
# 关闭 RDB 文件的压缩功能
rdbcompression no
负责初始化数据结构;
进行一些重要设置:
serverCron
函数创建时间事件;[8040] 01 Dec 20:12:41.758 * DB loaded from disk: 0.001 seconds
[8040] 01 Dec 20:12:41.758 * The server is now ready to accept connections on port 6379
;--结束END--
本文标题: Redis | 第7章 Redis 服务器《Redis设计与实现》
本文链接: https://www.lsjlt.com/news/8963.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-30
2024-04-30
2024-04-30
2024-04-29
2024-04-29
2024-04-29
2024-04-18
2024-04-17
2024-04-11
2024-04-08
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0