Memcached使用与实践

来源:互联网 发布:人机界面编程 编辑:程序博客网 时间:2024/05/16 14:46

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.gztar -zxvf libevent-2.0.22-stable.tar.gzcd libevent-2.0.22-stable./configure --prefix=/usr/local/libeventmake && make installwget http://www.memcached.org/files/memcached-1.4.24.tar.gztar -zxvf memcached-1.4.24.tar.gzcd memcached-1.4.24./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libeventmake && make installln -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.tgztar -xvf memcached-2.2.0.tgzcd 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.iniextension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226extension=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.工作线程

处理客户端连接的请求

0 0