C语言 c++ php mysql nginx linux lnmp lamp lanmp memcache redis 面试 笔记 ppt 设计模式 问题 远程连接

memcache 内部原理实现

 

Lazy Expiration
  memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期。这
  种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间。

LRU( Least Recently Used 最近少使用):

  从缓存中有效删除数据的原理
  memcached 优先使用已超时的记录的空间,但即使如果也会发生空间不够用的情况,这时就要用LRU策略进制进行空间分配
  从最近未被使用的记录中搜索,并将空间分配给新的记录

  指定 -M 参数禁用LRU,内存写满后会返回错误 memcached 毕竟不是存储器,而是缓存,所以推荐使用 LRU

 

分布式算法: 

memcached的分布式算法是在客户端实现的,当一个key确定的时候也就确定了他要存储的mc节点
算法:crc32(key)/n key为要缓存的键,n为链接的服务器节点数
优点:余数计算的方法简单,数据的分散性也相当优秀
缺点:当添加或移除服务器时,余数就会产生巨变,从而影响缓存的命中率。

解决方案:
一致性 hash 算法(Consistent Hashing)
首先计算出节点的hash值,分布到 0~2^32的园上,然后用同样的方法求出存储数据的键的hash值,并映射到圆上
从映射位置开始顺时针开始查找,首次遇到的服务器则为要存储的节点,如果超过后仍找不到则放到 第一台节点上

采用这种算法,当增加或减少服务器时只有很少的部分key会受到影响

虚拟节点:当节点数非常少时,分布会不均匀,可以把节点放大几百倍,然后一个节点对应多个虚拟虚拟解决,会达到同样的效果

Memcached、Key-Value Store 、Bittorrent DHT、LVS中都采用了Consistent Hashing算法

http://blog.csdn.net/sparkliang/article/details/5279393

 

todo

posted on 2014-04-16 15:18  思齐_  阅读(740)  评论(0编辑  收藏  举报