memcached简介
memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料
Memcached基于一个存储键/值对的hashmap。其守护进程(daemon
)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信
memcached的安装,配置等基本参数,基本用法(PHP)
http://nl1.php.net/manual/zh/...
memcached分布式hash策略
Memcache安装完成之后,可以设置哈希策略,memcache.hash_strategy。目前有standard模式和consistent模式。standard模式其实就是%,即取模。而consistent,就是hash的一致性算法。
在Memcache中,hash策略在PHP.ini文件中设置
[Memcache] Memcache.allow_failover = 1 Memcache.hash_strategy =consistent Memcache.hash_function =crc32
余数分布算法
假如有2台服务器node0,node1和node2,当hashcode=5时,5%3=2,就路由到第3台机器。但是如果其中node2服务down之后,那么所有路由到node2的数据都会丢失
后期如果业务增长后,需要增加node4,那么之前的所有数据又要失效了,所以不方便扩展
一致性分布算法(基于libketama)
简单说来,一致性hash算法就是先把服务器也通过某一个特征(如IP/MAC地址)hash一下,这样服务器会按照分布(可能不均匀)在一个范围,然后把key再hash一下,然后看key最近的下个服务器作为该key的存储bin。
这样,如果增加一台服务器,重新分配的key只是分布再新增的这个服务器和上一个最近的服务器之间的key,其余的都不变。
http://blog.csdn.net/kongqz/a...
memcached的存储数据结构
Hash表是Memcached里面最重要的结构之一,其采用链接法来处理Hash冲突(和PHP解决hash冲突一样,链地址法),当Hash表中的项太多时,也就是Hash冲突比较高的时候,Hash表的遍历就脱变成单链表,此时为了提供Hash的性能,Hash表需要扩容,Memcached的扩容条件是当表中元素个数超过Hash容量的1.5倍时就进行扩容,扩容过程由独立的线程来完成,扩容过程中会采用2个Hash表,将老表中的数据通过Hash算法映射到新表中,每次移动的桶的数目可以配置,默认是每次移动老表中的1个桶。
http://blog.csdn.net/liziyun5...
memcache内存分配
把数据组装成 item 之前,必须为 item 分配存储空间,memcached 不是直接从操作系统分配内存的,
memcached内部使用了类似内存池的东西,即slab机制,来管理内存. 内存的分配和回收都交给 slab 子系统实现。memcached 中,内存的分配和回收,都是通过 slab 实现的,slab机制相当于内存池机制,
实现从操作系统分配一大块内存,然后 memcached 自己管理这块内存,负责分配与回收像一般的内存池一样,从操作系统分配到一大块内存后,为了方便管理,把这大块内存划分为各种大小的 chunk,
chunk的大小按照一定比例逐渐递增,如下图所示:从 slab 分配内存的时候,根据请求内存块的大小,找到大小最合适的 chunk 所在的 slabclass,然后从这个slabclass 找空闲的 chunk 分配出去. 所谓最合适就是指 chunk 的大小能够满足要求,而且碎片最小。如下图:
这种分配方式的缺点是存在内存碎片,例如,将 100字节的 item 存储到一个 128 字节的 chunk,就有 28 字节的内存浪费,如下图所示:
-
slabclass 是由 chunk size 确定的,同一个 slabclass 内的 chunk 大小都一样,每一个
slabclass 要负责管理 一些内存,初始时,系统为每个 slabclass 分配一个 slab,一个 slab
就是一个内存块,其大小等于 1M. 然后每个 slabclass 再把 slab 切分成一个个 chunk,算一下,一个
slab 可以切分得到 1M/chunk_size 个chunk一个slabclass分配一个slab
一个slab分成多个chunk(同一个slab中chunk相等)
一个chunk就是一个item(这个item不一定全部利用)
memcache其他延伸
Magent代理
http://blog.csdn.net/qwe61120...
参考资料:
http://www.cnblogs.com/xrq730...
memcache源码分析
http://blog.csdn.net/column/d...
http://blog.csdn.net/lcli2009...
http://www.jianshu.com/p/fcf9...