最新消息:阿啰哈,本人90后,目前单身,欢迎妹子们来撩!.(。→‿←。) 微信:frank01991

memcached介绍及原理

memcached是一种缓存技术,存储在内存中(高性能分布式内存缓存服务器)。目的:提速。(传统的都是把数据保存在关系型数据库管理系统即RDBMS,客户端请求时会从RDBMS中读取数据并在浏览器中显示,这样当访问量过大时或集中时,导致RSBMS负担过重,数据库响应恶化,浏览器中显示延迟等严重问题,使用memcached减少数据库查询和访问次数以提高访问速度,提高扩展性)
memcached为key->value非关系型数据库,key为一般字串,值唯一。value除了php中的资源不能存,其它的数据都能存储(字符串、数值、数组、对象、布尔值、null、二进制<图片、视频>)
提速方法:
1、传统:模拟cached方法(存储到数据库时生成一份静态文件到磁盘中)
2、直接操作内存(内存表,memcached服务维持了一张内存表 hashdata)
3、CPU寄存器(最高速的,但是代价成本高)
memcached特征:
1、协议简单(文本行协议) 
2、基于libevent事件处理(注:libevent是一个程序库,封装了linux的epoll、BSD类操作系统的kqueue等事件处理功能。即使对服务器的连接数添加,也能发挥O(1)的性能。memcached在linux、BSD等操作系统上能发挥其高性能。)
3、内置内存存储方式(存储在memcached内置的内存存储空间中,提高性能。 问题:memcached重启或操作系统重启数据会丢失,达到一定量后会启动算法自动删除不使用的缓存)
4、不互相通信的分布式(不互相通信共享信息。)
memcached作用:
1、高性能分布式缓存服务器(缓存数据库查询结果,减少数据库访问次数)
      缓存读取/写入过程见下图
memcached适合做的东西:
1、访问频繁的字典数据
2、大量的hot数据(热门数据缓存)
3、页面缓存(web站常用)
4、搜索的查询条件和结果(热门搜索的内容缓存起来)
5、临时处理数据(不需要入库,排重)
memcache工作原理:
memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。
采用的是C/S模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。以key->value形式,key 的值通过 hash 进行转换,然后确定对那台sever存储/获取数据。
memcache内存算法:
使用的是slab allocation机制分配和管理内存,按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
memcached缓存策略:
是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先 替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过 期,这样可减轻服务器的负载。
memcached失效策略:
Lazy expiration + LRU
Lazy expiration作用:假如我们所存储的数据项相当多的时候,在这时候进行监控的话,花费的代价是相当大的,所以memcached不会在过期监视上耗费过多的CPU时间,从而在性能方面也起到一定的优化作用。
LRU:memcache会优先使用已超时的空间,但是还是会有追加信息时空间不足的状态,这时候会使用Least Recently Used(LRU)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
memcached分布式算法:
当向memcached集群存入/取出key/value时,memcached客户端会根据一定算法计算存入那台服务器。(第一步:选择服务器,第二步:存取数据)
余数算法:先求得键的整数散列值,再除以服务器数量,根据余数觉得存储那台服务器。(特点:简单、高效。但是扩展性差,服务器数量变更时,几乎所有的缓存都会失效)
散列算法:先计算memcached的散列值,并将其分布在0—2^32的圆上,然后用同样的方法算出存储数据键的散列值并映射至圆上,最后从数据映射到的位置开始顺顺时针查找,将数据保存在查找到的第一台服务器,如果超过2^32还是找不到,则将数据保存在第一台memcached服务器上。如果添加一台memcached服务器,则只在圆上添加的逆时针方向的第一台服务器上的键会受到影响。
memcached与redis比较
cpu
内存利用率
持久性
数据结构
工作环境
memcached
支持多核
简单
linux/windows
redis
单核
低(采用压缩会比memcached高)
有(硬盘存储,主从同步)
复杂
linux
注:
散列值:将值从一个大的(可能很大)定义域映射到一个较小值域的(数学)函数。散列函数是把该函数应用到大的定义域中的若干值的(大)集合的结果可以均匀地(和随机地)被分布在该范围上。

via: http://blog.csdn.net/guugle2010/article/details/40115675
http://blog.csdn.net/unix21/article/details/15501049
http://2941026.blog.51cto.com/2931026/1304314
https://code.google.com/p/memcached/wiki/NewOverview
http://memcached.org/

转载请注明:林志斌 » memcached介绍及原理

发表评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址