Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问,提高web性能。
特点:
1.协议简单;
2.基于libevent的事件处理(还真不太理解libevent的事件处理)
3.内置内存存储方式
4.采用不互相通信的分布式
以守护程序的方式运行于一个或多个服务器中。
需要注意的是:
由于数据仅存在内存中,因此重启Memcached或者重启操作系统都会导致数据丢失。
另外,内存容量达到指定值后,就会使用LRU(Least Recently Used最近使用最少)算法自动删除不使用的(或很少使用的)缓存。
Memcached本身是为缓存而设计的,因此没有考虑太多的数据持久化。
wget http://nchc.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz tar -zxvf libevent-2.0.22-stable.tar.gz cd libevent-2.0.22-stable ./configure --prefix=/usr/local/libevent make && make install wget http://www.memcached.org/files/memcached-1.4.24.tar.gz tar -zxvf memcached-1.4.24.tar.gz cd memcached-1.4.24 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent make && make install ln -s /usr/local/memcached/bin/memcached /bin/
Memcache启动命令:
memcached -d -m 128 -u www -p 11211
常用启动选项:
-d 以守护程序(deamon)方式运行Memcached
-t 线程数(默认4)
-m 设置内存大小,单位MB
-l 设置监听的IP,如果是本季的话,通常不设置此参数
-p 监听的端口,默认11211
-u 指定用户
下载memcached扩展包(memcached与memcache的区别)
wget http://pecl.php.net/get/memcached-2.2.0.tgz tar -xvf memcached-2.2.0.tgz cd memcached-2.2.0 /usr/local/php/bin/phpize ./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl #报错: #checking for libmemcached location... configure: error: memcached support requires libmemcached. Use --with-libmemcached-dir=<DIR> to specify the prefix where libmemcached headers and library are located #解决:缺少libmemcached,memcached扩展需要libmemcached客户端库的支持 wget https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz ./configure --prefix=/usr/local/libmemcached ... #修改php.ini extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226 extension=memcached.so
简单实例:
<?php
$memcached = new Memcached(); //创建一个memcached对象
$memcached->addServer('localhost', 11211) or die ("Could not connect"); //连接Memcached服务器
$memcached->add('mihua', 'mengmeng'); //设置一个变量到内存中,名称是key 值是test
$get_value = $memcached->get('mihua'); //从内存中取出key的值
echo $get_value;
//打印内容:mengmeng
深入理解Memcached
1.Mecached如何支持高并发
Mecached使用多路复用I/O模型,
而多路复用I/O是一种消息通知模式,用户连接好I/O准备后,系统会通知我们这个连接可以进行I/O操作,这样就不容易阻塞。
此外,Memcached使用了多线程模式。在启动Memcached服务器时可使用 -t 参数指定要开启的线程数。
但并不是线程数越多越好,一般设置为CPU的核数,省去了CPU的切换时间,效率最高。
还有,因为线程数越多,系统需要的线程调度时间就越多。而把线程数设置成CPU核数,系统需要的线程调度时间最少
2.Memcached默认只能存储不大于1MB的数据,修改Memcached源码可以打破这个限定,只需把POWER_BLOCK宏设置为更大的数)
这主要是因为Memcached在存储数据时使用Slab内存分配算法。使用这种算法可以减少生成内存碎片,提高内存使用率。
不过我还没太理解这种Slab算法,~~~~(>_<)~~~~
Slab分配算法的原理是,把固定大小(1M)的内存块划分为n小块。把每1MB的内存块成为一个slab页,每次向系统申请一个slab页,
然后再通过分割算法把这个slab页分割成若干小块的chunk,然后把这些chunk分配给用户使用。
3.Memcached为每个item设置一个过期时间,但不是到期就把item从内存中删除,而是访问item时如果到了有效期,才把item从内存中删除。
4.使用LRU算法淘汰数据
当Memcached使用内存数大于设置的最大内存使用数时,为了腾出内存空间来存放新的数据项,Memcached会启动LRU算法淘汰旧的数据项。
从源码中可知(在《PHP核心技术与最佳实现》中的363页)
使用slabs_alloc 函数申请内存失败时,就开始淘汰数据了。淘汰规则是,从数据项列表(item_list)尾部开始遍历,在列表中查找一个引用计数器(refcount)为0的item,把此item释放。列表的先进新出的原则
5.Memcached是一个多线程的缓存服务器。分为:
1.主线程
接收客户端连接,并把连接分配给工作线程处理。
2.工作线程
处理客户端连接的请求