【NoSQL】memcached介绍

前端之家收集整理的这篇文章主要介绍了【NoSQL】memcached介绍前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

猜你在找的NoSQL相关文章