memcached源码分析

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
状态:更新中
dexcoder
1年前

共 11 篇

前一篇博文以get命令为例子把整个处理流程简单讲述了一遍,本篇博文将以set命令详细讲述memcached的处理流程。具体的命令为“set tt 3 0 10”,并假设当然memcached服务器没有名为tt的item。 读取命令: ? ? ? ??在前一篇博文的最后,conn的状态被设置为conn_new_cmd,回到了
1年前发布
? ? ? ??本文以get命令为例子,探讨memcached是如何处理命令的。本文只是探讨memcached处理命令的工作流程,具体的代码细节在不影响阅读的前提下能省略的就省略、能取默认值就取默认值、内存是足够的(不需要动态申请空间就够用了)。涉及到数组、缓存区的就假设已经分配好了。
1年前发布
需求: ? ? ? ? 考虑这样的一个情景:在一开始,由于业务原因向memcached存储大量长度为1KB的数据,也就是说memcached服务器进程里面有很多大小为1KB的item。现在由于业务调整需要存储大量10KB的数据,并且很少使用1KB的那些数据了。由于数据越来越多,内存开始吃紧。大小为10
1年前发布
过期失效处理: ? ? ? ??一个item在两种情况下会过期失效:1.item的exptime时间戳到了。2.用户使用flush_all命令将全部item变成过期失效的。读者可能会说touch命令也可以使得一个item过期失效,其实这也属于前面说的第一种情况。 超时失效: ? ? ? ??对于第一种过期失效,memc
1年前发布
锁级别: ? ? ? ? 从前面的《扩展哈希表》知道:哈希表进行扩展时,有一个专门的线程负责将item数据从旧哈希表迁移到新哈希表(由此,也称这个线程为迁移线程)。此外,还有一些worker线程会时不时访问item(包括插入、删除和获取)。这些线程的对item所做的操作基本上都是互斥的
1年前发布
LRU队列: ? ? ? ??之前的《slab内存分配》博文已经写到:一个slab class里面的所有slab分配器只分配相同大小的item,不同的slab class分配不同大小的item。item结构体里面有一个slabs_clsid成员,用来指明自己是属于哪个slab class的。这里把slabs_clsid值相同的item称为是同
1年前发布
哈希结构: ? ? ? ??main函数会调用assoc_init函数申请并初始化哈希表。为了减少哈希表发生冲突的可能性,memcached的哈希表是比较长的,并且哈希表的长度为2的幂。全局变量hashpower用来记录2的幂次。main函数调用assoc_init函数时使用全局变量settings.hashpower_init作为参
1年前发布
slab简介: ? ? ? ??memcached使用了一个叫slab的内存分配方法,有关slab的介绍可以参考链接1和链接2。可以简单地把它看作内存池。memcached内存池分配的内存块大小是固定的。虽然是固定大小,但memcached的能分配的内存大小(尺寸)也是有很多种规格的。一般来说,是满足需求的
1年前发布
半同步/半异步: ? ? ? ??memcached使用半同步/半异步网络模型处理客户端的连接和通信。 ? ? ? ? 半同步/半异步模型的基础设施:主线程创建多个子线程(这些子线程也称为worker线程),每一个线程都维持自己的事件循环,即每个线程都有自己的epoll,并且都会调用epoll_wait函数
1年前发布
本文开启本系列博文的代码分析。本系列博文研究是memcached版本是1.4.21。 本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值。以便在分析memcached源码的时候好随时查看。当然也方便使用memcached时可以随时查看各个参数的含义。《如何阅读memcached源码
1年前发布
安装: ? ? ? ??安装memcached之前要先安装Libevent。现在假定Libevent安装在/usr/local/libevent目录了。 ? ? ? ??因为memcached安装后不像Libevent那样,有一堆头文件和库文件。安装后的memcached不是用来编程而直接用来运行的。所以不需要在/usr/local目录下专门为memcache
1年前发布