关闭

memched1.0源码阅读(2)——基础数据结构

标签: memched分布式内存存储
276人阅读 评论(0) 收藏 举报
分类:
stats 这个结构表示memched的状态,例如读写的字节数、启动时间等等信息
// 状态
struct stats {
    // 当前的对象的个数
    unsigned int  curr_items;
    // 总的对象的个数
    unsigned int  total_items;
    // 当前的占用的字节数量
    unsigned long long  curr_bytes;
    // 当前的连接数
    unsigned int  curr_conns;
    // 总的连接数
    unsigned int  total_conns;
    // 当前的套接字会话的数量
    unsigned int  conn_structs;
    // get命令的个数
    unsigned int  get_cmds;
    // set命令的个数
    unsigned int  set_cmds;
    // get命中的次数
    unsigned int  get_hits;
    // gei失败的次数(未命中)
    unsigned int  get_misses;
    // 启动的时间
    time_t        started;          /* when the process was started */
    // 读取了多少字节
    unsigned long long bytes_read;
    // 写入了多少字节
    unsigned long long bytes_written;
};
settings 表示启动时的相关设置,例如监听的ip和端口等等
// 设置
struct settings {
    // memched占用的最大字节数
    unsigned long long maxbytes;
    // 对象的最大个数
    int maxitems;
    // 连接的最大数量
    int maxconns;
    // 监听的端口
    int port;
    // 监听地址
    struct in_addr interface;
    // 其他的一些命令
    int verbose;
};
_stritem/item 表示memched存储的一个对象,它始终在内存中
// 内存对象,所有的对象使用链表连接起来
typedef struct _stritem {
    struct _stritem *next;
    struct _stritem *prev;
    // 引用计数
    int    refcount; 
    // 对象的标志
    int    it_flags;
    // key
    char   *key;
    // 数据
    void   *data;
    // 当前item的类型(根据item占用内存的大小进行分类,从slabs中分配和回收内存的时候需要用到)
    unsigned int slabs_clsid;
    // 数据的大小
    int    nbytes;  /* size of data */
    // 总的大小(键加值占用的字节数)
    int    ntotal;  /* size of this struct + key + data */
    // 标志
    int    flags;
    // 上一次被访问的时间
    time_t time;    /* least recent access */
    // 已经在内存中多少时间了
    time_t exptime; /* expire time */
    // 数据
    void * end[0];
} item;
conn 结构表示一个套接字会话,存储了一个套接字的相关信息
// 套接字会话
typedef struct {
    // 文件描述符
    int    sfd;
    // 状态
    int    state;
    // 事件
    struct event event;
    // 事件标志
    short  ev_flags;
    // 正在触发的事件
    short  which;  /* which events were just triggered */

    // 读缓存
    char   *rbuf;  
    // 读缓存的大小
    int    rsize;
    // 当前的有效字节数
    int    rbytes;

    // 写缓存
    char   *wbuf;
    // 当前的写位置
    char   *wcurr;
    int    wsize;
    int    wbytes; 
    int    write_and_go; /* which state to go into after finishing current write */
    void   *write_and_free; /* free this memory after finishing writing */

    char   *rcurr;
    int    rlbytes;
    
    /* data for the nread state */

    /* 
     * item is used to hold an item structure created after reading the command
     * line of set/add/replace commands, but before we finished reading the actual 
     * data. The data is read into item->data to avoid extra copying.
     */

    // 当前处理的item
    void   *item;     /* for commands set/add/replace  */

    // 对item的操作(设置、新增、替换)
    int    item_comm; /* which one is it: set/add/replace */

    /* data for the swallow state */
    // 被丢弃字节的数量(例如一些错误的信息需要丢弃)
    int    sbytes;    /* how many bytes to swallow */

    /* data for the mwrite state */
    // 被当前套接字处理的item数组
    item   **ilist;   /* list of items to write out */

    // 上述数组的大小
    int    isize;

    // 指向当前处理的item?
    item   **icurr;

    // 剩余item的数量
    int    ileft;
    int    ipart;     /* 1 if we're writing a VALUE line, 2 if we're writing data */
    char   ibuf[256]; /* for VALUE lines */
    char   *iptr;
    int    ibytes;
                         
} conn;
conn_states 枚举表示套接字对话的状态
// 套接字会话的状态
enum conn_states {
    // 正在监听
    conn_listening,  /* the socket which listens for connections */
    // 正在读取
    conn_read,       /* reading in a command line */
    // 正在写入
    conn_write,      /* writing out a simple response */
    // 读取固定数量的字节
    conn_nread,      /* reading in a fixed number of bytes */
    conn_swallow,    /* swallowing unnecessary bytes w/o storing */
    // 正在关闭
    conn_closing,    /* closing this connection */
    // 顺序写
    conn_mwrite      /* writing out many items sequentially */
};
slabclass_t 表示slabs内存分配器。它有一个属性叫做size,它表示了这个slab只分配大小为size的内存块,每一个slab都预先分配好一定量的内存块,然后放在slab中。所有的item对象的内存都从slab中分配内存,首先会根据item需要的内存的大小,计算出对应的slab的id(或者类别),然后找到对应的slab分配内存。
// slabs对象
// memcached管理的对象叫做item,它只管管理这些对象是否可用,新增,删除等待,对于这些item占用的内存则由slabs管理
// slabs对于它分配的每一块内存都当作一个对象
typedef struct {
    // 这个对象的大小
    unsigned int size;      /* sizes of items */
    // 有多少个item在slabs中
    unsigned int perslab;   /* how many items per slab */
    // item对象的指针数组
    void **slots;           /* list of item ptrs */
    unsigned int sl_total;  /* size of previous array */
    unsigned int sl_curr;   /* first free slot */
    // 当前类型的slabs分配了多少个对象
    unsigned int slabs;     /* how many slabs were allocated for this class */
} slabclass_t;


0
0
查看评论

memched1.0源码阅读(1)——介绍

1、介绍      memched是一个高性能的分布式内存对象缓存系统。它通过在内存中数据来减少磁盘io的次数。memched是一个基于键值对存储的hashmap。      memched可以在内存中存储任意数据,...
  • NB_vol_1
  • NB_vol_1
  • 2016-05-30 17:30
  • 486

数据结构---字符串(2)

1、把字符串转换为整数 题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 本题目不是很难,但有几个注意事项 1.要判断输入字符串是否有效,即判断输入字符串是否为空和判断字符串中有没有其他非数字的字符 2.判断字符串开头是否...
  • hla199106
  • hla199106
  • 2015-09-06 18:28
  • 391

memched1.0源码阅读(3)——运行流程

一、主流程,直接从main函数开始入手。 1、调用settings_init函数,初始化全局变量settings,这个全局变量存放了memched的环境设置。 2、解析输入的参数,设置全局变量setting相关参数。 3、调用item_init函数,进行内存对象(item)的相关设置。 4、调用ev...
  • NB_vol_1
  • NB_vol_1
  • 2016-05-30 20:38
  • 351

【哈工大oj】1551 - 基础数据结构——字符串2 病毒II(水)

基础数据结构——字符串2 病毒II Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 827(308 users) Total Accepted: 455(298 users) Rating:  Spec...
  • wyg1997
  • wyg1997
  • 2016-01-15 14:44
  • 247

Hrbust-1546-基础数据结构——单链表(1)【链表实现】

基础数据结构——单链表(1) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 1007(345 users) Total Accepted: 367(307 users) Rating: Special Judge: ...
  • kuronekonano
  • kuronekonano
  • 2017-06-01 23:43
  • 131

memched1.0源码阅读(4)——事件的处理流程

在讲解事件处理之前,先讲解套接字会话的创建: 我们可以看到在套接字会话创建的过程中,调用了一个叫event_set/event_add的函数,这是libevent的接口,它就把套接字感兴趣的事件(例如读写之类的事件)以及相应的事件回调函数(event_handler)添加到libevent中,这样每...
  • NB_vol_1
  • NB_vol_1
  • 2016-05-30 21:45
  • 339

UOJ#228 基础数据结构练习题

区间加操作正常做,考虑开根操作,维护区间最大最小值,如果区间的最大最小值开根后相同,则直接区间赋值,如果不同但最大值为最小值加1,则区间加上根号最小值减最小值,否则递归下去 考虑这个算法的复杂度,如果两个相邻的点导致包括这两个点的区间必须要从这里分成两边才能处理开根操作(即两个数开根后不同且大的那个...
  • neither_nor
  • neither_nor
  • 2016-08-15 09:05
  • 772

UOJ 228 基础数据结构练习题

线段树 多写点骗点访问量 加法好说,开平方就很气了,因为开平方的信息不能合并。这样就导致常规的线段树,分块之类的维护数列和的方法不能用。我们只能另辟蹊径,找寻性质。我们发现开平方操作会让数字减少得很快,大概六七次就能把一个数变成1。这给我一种在不特意构造数据的情况下,最终数字很容易变得大部分都一样的...
  • ziqian2000
  • ziqian2000
  • 2017-03-25 17:54
  • 389

HDU 5479 Scaena Felix(简单的数据结构题目)

本题为简单的数据结构题目,当然也可以不用数据结构来写,本渣渣的AC代码如下这里写代码片#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using nam...
  • qq_32866009
  • qq_32866009
  • 2016-02-19 13:15
  • 167

hrbust1545 基础数据结构——顺序表(2)

题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 题意:输入n个数,然后去重 说明:用了程杰的《大话数据结构》里的线性表,并加以修改。 #in...
  • f1024042400
  • f1024042400
  • 2014-12-29 20:58
  • 235
    个人资料
    • 访问:301506次
    • 积分:6413
    • 等级:
    • 排名:第4490名
    • 原创:328篇
    • 转载:32篇
    • 译文:0篇
    • 评论:63条
    最新评论