理解 memcached 扩展


php开发中,我们平时说的 mc和mcd 都是php的扩展


总结

  新业务使用mcd,比mc好,将来服务升级会少遇到很多坑。
  mcd是在mc的基础上做了更多的拓展,api接口功能增加和事件处理上有做优化。
  mcd在高并发下相对mc的稳定性提高不少。


mcd 事件处理方式

  mcd 使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能;

  libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能;

  epoll、kqueue的事件处理是由系统内核维护,处理速度非常快,事件触发的机制而非select、poll这样的轮询机制;
  nginx也是使用libevent库处理事件的;


mcd 和 mc 共用时遇到的问题(压缩问题 flag)

mc 扩展和 mcd 扩展读写数组数据是否不相兼容

  参考链接1:https://www.jianshu.com/p/8d0a6e12bcfb
  参考链接2:https://blog.csdn.net/xxx9001/article/details/51922613?locationNum=10&fps=1

  使用时,如果两者都没有压缩的话,相互读取设置是不会有问题的;

  如果启用压缩,因为两者的 add 方法中参数 flag 不一致,mcd提供更多的值,导致压缩和解压缩出来的数据对不上,所以才出现了问题。

  我这还遇到另一个问题是:当value的长度到一定值(如128),会启动压缩,短的字符串不压缩,没再自己研究了;

  因为我写的服务以前版本是用的mc,改版升级不重启的情况下,老服务就只能依旧使用mc了,新的业务使用mcd。



关于mc的基础知识

mc 介绍及功能

  memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担。它通过在内存中缓存数据和对象,来减少读取数据库的次数。从而提高动态、数据库驱动网站速度。

  memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。memcache主要用于分担数据库负的压力,memcache将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。  


为什么会有memcache和memcached两种名称

   memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。
   memcache可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,memcached自管理这些HashTable。
   
   memcache(服务端)和php的(mc扩展和mcd扩展)客户端组合使用。


mc 内存用完,使用LRU(最近最少使用)策略

   当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。


mc 的工作原理

   参考链接:https://blog.csdn.net/column/details/lc-memcached.html
   
   以前的版本是单进程、单线程、异步I/O,基于事件(libevent)的方式。
   现在是单进程、一主(master)多从(worker)线程,异步I/O,基于事件(libevent)的方式。

   多个Server可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理;分布式的概念是用客户端来做,mc并没有做数据的同步功能;


分布式选择哪台服务器算法

   选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
   1、余数算法:
      先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
   2、散列算法:
      先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。
散列算法


mc 中的一些限制

1、MemCache中可以保存的item数据量是没有限制的,只要内存足够
2、MemCache在64位机器最大使用内存没有限制
3、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作
4、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效
5、MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序。
6、单个item的大小被限制在1M byte之内,最好不要存储大数据;key长度是在250个字符,最好做md5
7、虚拟主机不让运行memcached服务


使用Slab分配算法保存数据

   slab分配算法的原理是:把固定大小(1MB)的内存分为n小块。
   slab分配算法把每1MB大小的内存称为一个slab页,每次向系统申请一个slab页,然后再通过分隔算法把这个slab页分割成若干个小块的chunk,然后把这些chunk分配给用户使用。
   这块还需要仔细研究。
   


引用的资源

【Memcached 源码分析专栏】 https://blog.csdn.net/column/details/lc-memcached.html
【深入理解Memcache原理】https://blog.csdn.net/wusuopuBUPT/article/details/18238003

猜你喜欢

转载自blog.csdn.net/yihaiweiyi/article/details/81416338