您的位置:首页 > 数据库 > Memcache

Memcached使用与实践

2015-10-26 23:49 921 查看
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.工作线程

处理客户端连接的请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: