memcache1.2.8系统分析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
memcache1.2.8系统分析

Memecache相关介绍 memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据 官网:/memcached Memcache的事件触发机制用了libevent Memecache相关介绍 libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。 简单的使用方法 sfd是socket句柄,当句柄有EV_READ事件发生时就调用event_handler函数 内存布局图的补充说明: 纵向链表:通过hash快速定位内存item 横向链表:LRU队列(一个头一个尾指针),头节点是最新访问的item 纵向hash链表说明:第一次是2的16次方个桶,当节点数超过2的16次方的1.5倍时,扩大桶的数量为2的17次方,依次增加到18次方等等 基本上维持在一个桶里保存1到2个内存块 横向链表说明:当内存块都用光了,就要考虑淘汰掉已经使用的 采用最近最久未使用算法 内存布局图的补充说明: 每个slab分配器维护1M内存 第一个slab,维护大小为一个chunk的item,数量为1M/chunk大小 第二个slab,维护大小为1.5个chunk的item,数量为1M/1.5chunk大小 直到item大小超过512k为止 最后再有一个slab的chunk大小是1M 分配的时候,从头开始找到第一个item大小比需要的内存大的slab,由它分配一个预创建的item 回收的时候,将time挂到相应的slab上 当slab上预创建的、回收的item都用光了,就new一个 当指定给memcache的内存都用完了时,从lru队列里回收一个 /* ?* Generates the variable-sized part of the header for an object. ?* ?* key???? - The key ?* nkey??? - The length of the key ?* flags?? - key flags ?* nbytes? - Number of bytes to hold value and addition CRLF terminator ?* suffix? - Buffer for the VALUE line suffix (flags, size). ?* nsuffix - The length of the suffix is stored here. ?* ?* Returns the total size of the header. ?*/ int item_make_header(char *key, uint8_t nkey, int flags, int nbytes, ???????????????????? char *suffix, int *nsuffix) { ??? *nsuffix = sprintf(suffix, %u %u\r\n, flags, nbytes - 2); ??? return sizeof(item) + nkey + *nsuffix + nbytes; } 这里的nbytes将value的长度保存起来了。因为item的key和value都不是定长的,所有必须保存它们的长度,key的长度直接保存在item的nkey中,value的长度则没有专门的变量来记录,这个suffix便是用来保存这些数据的,一是item的flag,另一个是value的长度。 item_alloc函数在初始化item的后面有一句代码:memcpy(ITEM_suffix(it), suffix, nsuffix); 这样便将suffix复制到了#define ITEM_suffix(item) ((char*) ((item)-end[0]) + (item)-nkey + 1)处,这样就可以看出一个item是怎样保存的,首先放的是item,item中最后存放的是key,然后是suffix,接着才是value。这样就可以理解宏ITEM_data的定义了。 #define ITEM_data(item) ((char*) ((item)-end[0]) + (item)-nkey + 1 + (item)-nsuffix) complete_nread主要是要生成

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档