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
  • 余数分布算法

  1. 假如有2台服务器node0,node1和node2,当hashcode=5时,5%3=2,就路由到第3台机器。但是如果其中node2服务down之后,那么所有路由到node2的数据都会丢失

  2. 后期如果业务增长后,需要增加node4,那么之前的所有数据又要失效了,所以不方便扩展

  • 一致性分布算法(基于libketama)

  1. 简单说来,一致性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内存分配

  1. 把数据组装成 item 之前, 必须为 item 分配存储空间, memcached 不是直接从操作系统分配内存的,
    memcached内部使用了类似内存池的东西, 即slab机制, 来管理内存. 内存的分配和回收都交给 slab 子系统实现。

  2. memcached 中, 内存的分配和回收, 都是通过 slab 实现的, slab机制相当于内存池机制,
    实现从操作系统分配一大块内存, 然后 memcached 自己管理这块内存, 负责分配与回收

  3. 像一般的内存池一样, 从操作系统分配到一大块内存后, 为了方便管理, 把这大块内存划分为各种大小的 chunk,
    chunk的大小按照一定比例逐渐递增, 如下图所示:
    图片描述

  4. 从 slab 分配内存的时候, 根据请求内存块的大小, 找到大小最合适的 chunk 所在的 slabclass, 然后从这个slabclass 找空闲的 chunk 分配出去. 所谓最合适就是指 chunk 的大小能够满足要求, 而且碎片最小。如下图:
    图片描述

  5. 这种分配方式的缺点是存在内存碎片, 例如, 将 100字节的 item 存储到一个 128 字节的 chunk, 就有 28 字节的内存浪费, 如下图所示:图片描述

  6. 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...


hizengzeng
177 声望10 粉丝

hizengzeng