王志广的个人分享

学习Memcache

admin发表于2015-04-22  3,058次浏览 标签: 

Memcached是一个免费开源的,高性能的,具有“分布式”对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表以Key-value对的方式存在内存中。

Memcache::add — 增加一个条目到缓存服务器
Memcache::addServer — 向连接池中添加一个memcache服务器
Memcache::close — 关闭memcache连接
Memcache::connect — 打开一个memcached服务端连接
Memcache::decrement — 减小元素的值
Memcache::delete — 从服务端删除一个元素
Memcache::flush — 清洗(删除)已经存储的所有的元素
Memcache::get — 从服务端检回一个元素
Memcache::getExtendedStats — 缓存服务器池中所有服务器统计信息
Memcache::getServerStatus — 用于获取一个服务器的在线/离线状态
Memcache::getStats — 获取服务器统计信息
Memcache::getVersion — 返回服务器版本信息
Memcache::increment — 增加一个元素的值
Memcache::pconnect — 打开一个到服务器的持久化连接
Memcache::replace — 替换已经存在的元素的值
Memcache::set — Store data at the server
Memcache::setCompressThreshold — 开启大值自动压缩
Memcache::setServerParams — 运行时修改服务器参数和状态

Memcache中key的值默认为250可以查看配置文件找到define KEY_MAX_LENGTH 250查看和修改

Memcache内存分配机制
Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长因子。
Memcached分配出去的page不会被回收或者重新分配
Memcached申请的内存不会被释放
slab空闲的地方不会借给任何其他slab使用
所以会照常,Memcache占用的内存未满,而出现丢失数据的问题。

Memcache删除机制
Memcache对一些key-value添加时间限制,只有当key-value过期并使用的时候才会被清除内存,否则会存在内存中,等内存满在被删除。
Memcache当某一个slab使用满的时候,就会使用LRU机制删除。
LRU是Least Recently Used最近最少使用算法。源于操作系统使用的一种算法,对于在内存中但最近又不用的数据块叫做LRU,操作系统会将那些属于LRU的数据移出内存,从而腾出空间来加载另外的数据。

Memcache分布式方法
1、取模算法
是通过php求余算法来规定内容存放位置,优点简单,缺点如果服务器坏掉一台,命中率下降较大。
2、一致性哈希分布式
是通过php crc32,在每台服务器上创建多个节点,使它们crc32尽量均匀,然后通过key的crc32比较服务器节点的crc32,来区分存放位置,优点命中率下降较小,缺点麻烦。

Memcache缓存雪崩现象
造成原因:一般是由某个节点失效,导致其他的节点的缓存命中率下降,缓存中缺失的数据查询,短时间内造成的数据库服务器奔溃。重启DB,短期内又被压垮,但缓存的数据增加了一些,DB反复的多次的启动,多次缓存才能建立完毕,DB才能稳定的运行。
Memcache缓存无底洞现象
造成原因:是由于key分散分布在各个服务器上引起的,从而在取数据的时候需要读取多台Memcache服务器,造成的效率下降问题。
Memcache永久数据被踢现象
造成原因:是由于某个slab在内存中存满造成的,解决办法弄一台单独的永久存储。
Memcache缓存穿透
造成原因:查询一个不存在的数据,就会每次都会访问DB造成的。

你可以发表评论引用到你的网站或博客,或通过RSS 2.0订阅这个日志的所有评论。
上一篇:
下一篇:
已有2条评论
满足贷
2015 年 5 月 7 日

学习了。

尚吾网
2015 年 5 月 15 日

不止一次的来访,一如既往的支持。

我来说两句

  Ctrl+Enter