memcache 内部原理实现

时间:2024-01-09 20:34:44

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