资讯专栏INFORMATION COLUMN

【NoSQL】memcached介绍

icattlecoder / 1158人阅读

摘要:简介是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态应用的速度提高可扩展性。当表格满了以后,接下来新增的资料会以机制替换掉。目前有模式和模式。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61717.html

相关文章

  • 讲讲NoSQL比较火的三个数据库Memcached、Redis、MongoDB

    摘要:而今天主要讲用得比较多的三个。支持持久化操作,可以进行及数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。 前言 NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很多难以克服...

    Michael_Lin 评论0 收藏0
  • 讲讲NoSQL比较火的三个数据库Memcached、Redis、MongoDB

    摘要:而今天主要讲用得比较多的三个。支持持久化操作,可以进行及数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。 前言 NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很多难以克服...

    Lionad-Morotar 评论0 收藏0
  • 讲讲NoSQL比较火的三个数据库Memcached、Redis、MongoDB

    摘要:而今天主要讲用得比较多的三个。支持持久化操作,可以进行及数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。 前言 NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很多难以克服...

    szysky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<