作为 缓存,永远都脱离不了 增删改查 这一基本的 API,而这点儿也正是好多人刚开始看源码最感兴趣的部分,此次我们就
消息解析
、增删改查
、消息响应
等方面进行分析
本章承接 状态机 conn_read
逻辑(不熟悉的可以先查看 http://www.web-lovers.com/memcached-source-threads.html 状态机
部分),功能型的代码逻辑比较清晰,我们此次跟随着代码逻辑进行解析
另外由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
常用数据结构
这次我们再次拉来 conn
连接信息的数据结构,之前在 线程机制 中也有过介绍,存储某个 socket 连接的 所有连接信息数据,特别是其中的 rbuf
、rsize
、rcurr
、rbytes
、iov*
、msg*
等部分
另外就是 sendmsg
使用到的 msghdr、iovc 结构体,这个可以详见 sendmsg 的使用方法:Linux msghdr结构讲解 和 UNIX网络编程读书笔记:recvmsg和sendmsg函数
代码逻辑解析
接之前 线程机制 部分状态机逻辑,接收消息以后的逻辑依次为:消息解析、增删改查、消息响应
消息解析
状态机 drive_machine
状态转移进入 conn_read
状态,调用 try_read_network
逻辑进行命令的报文读取
|
|
报文数据读取完毕后状态转移至 conn_parse_cmd
,调用 try_read_command
、process_command
、tokenize_command
等函数进行客户端报文数据进行解析,解析出命令行,具体逻辑步骤可以查看代码注释
try_read_command
对读取的报文进行简单的有效性验证
|
|
process_command
实际命令处理逻辑,判断具体命令(get、add、replace 等)的处理逻辑,我们这里主要对常用命令进行解析
add_msghdr
方法被调用的逻辑点还是比较多的,由于 消息响应的 msghdr 结构体中 iovec结构体数组长度比较有限,而这个方法主要就是对响应列表进行扩容以及消息位置的整理
tokenize_command
为命令切割函数,比如 “set foo 0 0 3”,切割成 “set”、”foo”、”0”、”0”、”3”,注意这里会返回比实际元素个数 +1 长度的数组
实际的消息解析到这里已经完成,后续就根据 process_command
分发的具体 增删改查 逻辑进行运算了
增删改查
这里主要讲述入口处理,具体 增删改查逻辑的原子操作(do_item_get
、assoc_insert
、assoc_delete
)见 上一章存储机制 http://www.web-lovers.com/memcached-source-storage.html 的 hashtable 源码
部分
process_get_command
查询逻辑
process_update_command
写入逻辑,无论 set、add、append、replace、cas 用的都是 此逻辑
conn_nread
状态继续读取后续操作内容报文
do_store_item
最终最主要的存储逻辑
process_delete_command
删除逻辑,不过相对来说删除逻辑还是比较简单的
消息响应
add_iov
添加消息内容
add_msghdr
msghdr 扩容
进入状态机 conn_mwrite
状态进行消息响应
transmit
函数是枚举类型,主要往 客户端写入响应数据
本文作者: wettper
本文链接: http://www.web-lovers.com/memcached-source-add-del-review.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!