memcached存储(set)操作源码详解

第一步 命令解析 process_mset_command

  • 解析命令参数,参数验证,预处理,命令类型
  • 最主要的:分配item存储空间,事实上是do_slabs_alloc,每次分配都是一旦空间不足就1mb的slab page一次性分配一页
  • 设置连接状态为conn_nread
  • 准备接收数据

第二步 处理链接 实际写入

 最关键代码:

memcached.c

drive_machine(...){

...


        case conn_nread:
            if (c->rlbytes == 0) {  //检查点,如果c->rlbytes(剩余需要读取的字节数(remaining read length bytes))已经变为0,表示所有预期的数据已经完全读取完毕
                complete_nread(c);
                break;
            }

            /* Check if rbytes < 0, to prevent crash */
            if (c->rlbytes < 0) {
                if (settings.verbose) {
                    fprintf(stderr, "Invalid rlbytes to read: len %d\n", c->rlbytes);
                }
                conn_set_state(c, conn_closing);
                break;
            }

            if (c->item_malloced || ((((item *)c->item)->it_flags & ITEM_CHUNKED) == 0) ) { //ITEM_CHUNKED意味着是多块存储的大item,特殊情况标志,等存储后会将数据分散在多个链接的chunk中
                //如果c->item_malloced为true,表示当前正在处理一个特殊的单独分配的item,而不是从标准slab池中获取;
                //或者,如果c->item的it_flags字段的ITEM_CHUNKED位为0,表示当前处理的是一个不是分块存储的item. 也就是一般的通常的情况
                
                /* first check if we have leftovers in the conn_read buffer */
                if (c->rbytes > 0) {
                    int tocopy = c->rbytes > c->rlbytes ? c->rlbytes : c-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值