码迷,mamicode.com
首页 > Web开发 > 详细

PHP中memcache的使用

时间:2015-07-28 06:36:32      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

1、下载并安装Memcache服务器端

官网,libevent:http://www.monkey.org/~provos/libevent/,Memcache:http://memcached.org/

//1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure –prefix=/usr
//2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure –with-libevent=/usr

cd /usr/local/src
wget https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
wget http://www.memcached.org/files/memcached-1.4.24.tar.gz
wget https://pecl.php.net/get/memcached-2.2.0.tgz

tar -zxf libevent-2.0.22-stable.tar.gz 
cd libevent-2.0.22-stable
 ./configure  --prefix=/usr
make && make install

cd /usr/local/src
cd memcached-1.4.24
./configure --with-libevent=/usr
make && make install
/usr/local/bin/memcached -d -m 10 -u root -l 192.168.1.30 -p 12000 -c 256 -P /tmp/memcached.pid

cd /usr/local/src
tar -zxf memcached-1.4.24.tar.gz
phpize
./configure --with-php-config=php-config
make && make install
echo ‘extension=memcached.so‘ > /etc/php.d/memcached.ini
service php-fpm reload

参数解释

-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB
-u是运行Memcache的用户,我这里是root
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.30
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid

防火墙

# iptables -A INPUT -p tcp -s 192.168.1.30 –dport 12000 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.1.30 –dport 12000 -j ACCEPT

想开机自动启动的话,只需在/etc/rc.d/rc.local中加入一行命令就可以了

2、测试

<?php
$m = new Memcached();

/* Add 2 servers, so that the second one
   is twice as likely to be selected. */
$m->addServer(‘192.168.1.30‘, 12000, 33);

$v=str_repeat(‘a‘,1024*1024);

if( $m->add(‘mystr‘,$v,3600)){
        echo  ‘原始数据缓存成功!‘;
}else{
    echo ‘数据已存在:‘.$m->get("mystr");
}

memcached set数据的时候是默认压缩的,可以通过setOption(memcahed::OPT_COMPRESSION,0)来设置,也就是说memcached server不能存储超过1M的数据但是经过客户端压缩数据后,只要小于1M的数据都能存储成功

3、memcached的操作

Memcached — Memcached类

    Memcached::add — 向一个新的key下面增加一个元素
    Memcached::addByKey — 在指定服务器上的一个新的key下增加一个元素
    Memcached::addServer — 向服务器池中增加一个服务器
    Memcached::addServers — 向服务器池中增加多台服务器
    Memcached::append — 向已存在元素后追加数据
    Memcached::appendByKey — 向指定服务器上已存在元素后追加数据
    Memcached::cas — 比较并交换值
    Memcached::casByKey — 在指定服务器上比较并交换值
    Memcached::__construct — 创建一个Memcached实例
    Memcached::decrement — 减小数值元素的值
    Memcached::decrementByKey — Decrement numeric item‘s value, stored on a specific server
    Memcached::delete — 删除一个元素
    Memcached::deleteByKey — 从指定的服务器删除一个元素
    Memcached::deleteMulti — Delete multiple items
    Memcached::deleteMultiByKey — Delete multiple items from a specific server
    Memcached::fetch — 抓取下一个结果
    Memcached::fetchAll — 抓取所有剩余的结果
    Memcached::flush — 作废缓存中的所有元素
    Memcached::get — 检索一个元素
    Memcached::getAllKeys — Gets the keys stored on all the servers
    Memcached::getByKey — 从特定的服务器检索元素
    Memcached::getDelayed — 请求多个元素
    Memcached::getDelayedByKey — 从指定的服务器上请求多个元素
    Memcached::getMulti — 检索多个元素
    Memcached::getMultiByKey — 从特定服务器检索多个元素
    Memcached::getOption — 获取Memcached的选项值
    Memcached::getResultCode — 返回最后一次操作的结果代码
    Memcached::getResultMessage — 返回最后一次操作的结果描述消息
    Memcached::getServerByKey — 获取一个key所映射的服务器信息
    Memcached::getServerList — 获取服务器池中的服务器列表
    Memcached::getStats — 获取服务器池的统计信息
    Memcached::getVersion — 获取服务器池中所有服务器的版本信息
    Memcached::increment — 增加数值元素的值
    Memcached::incrementByKey — Increment numeric item‘s value, stored on a specific server
    Memcached::isPersistent — Check if a persitent connection to memcache is being used
    Memcached::isPristine — Check if the instance was recently created
    Memcached::prepend — 向一个已存在的元素前面追加数据
    Memcached::prependByKey — Prepend data to an existing item on a specific server
    Memcached::quit — 关闭所有打开的链接。
    Memcached::replace — 替换已存在key下的元素
    Memcached::replaceByKey — Replace the item under an existing key on a specific server
    Memcached::resetServerList — Clears all servers from the server list
    Memcached::set — 存储一个元素
    Memcached::setByKey — Store an item on a specific server
    Memcached::setMulti — 存储多个元素
    Memcached::setMultiByKey — Store multiple items on a specific server
    Memcached::setOption — 设置一个memcached选项
    Memcached::setOptions — Set Memcached options
    Memcached::setSaslAuthData — Set the credentials to use for authentication
    Memcached::touch — Set a new expiration on an item
    Memcached::touchByKey — Set a new expiration on an item on a specific server

 参见:http://php.net/manual/zh/book.memcached.php

注意事项:key的长度不能大于250字符,缓存对象的大小不能大于1MB,item对象的过期时间最长可以达到30天

如果使用的Memcached客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。

推荐使用较短的key,这样可以节省内存和带宽。

4、适用的场景

1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载

2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)

3)利用memcached可以缓存session数据、临时数据以减少对他们的数据库写操作

4)缓存一些很小但是被频繁访问的文件

5)缓存Web ‘services‘(非IBM宣扬的Web Services,译者注)或RSS feeds的结果

 

5、memcached的原理

1)Big-O

memcache的大部分功能(add,get,set,flush等)都是O(1)的操作,这意味着它们是恒定的时间功能,无论缓存里存了多少东西,这功能将只需要获得缓存中的一项,所以你不能遍历所有项目里的item

2)LRU算法

LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,它将删除最长时间不使用的数据。该数据可能并不是最大的数据,也不是第一个存储在缓存中的数据。

在实现时,一般使用一个哈希表类存储被缓存的对象,和一个双向链表类存储对象被使用的情况

所有的对象有有一个counter,这个counter记录了一个时间戳。当一个新的对象被创建的时候,counter就会被设置成当前时间。当一个对象被读取的时候,就会重置counter为当前的时间。一旦memcache需要为一个新的对象腾出空间而剔除旧对象时,只需要找到最低的counter对应的那个对象,这个对象要么是一直没有被读取或者是很长时间之前被读取(说明这个对象不需要了,否这的话该对象的counter应该会很接近当前时间)。

这样创建了一个简单系统,并使用了非常高效的缓存。如果它不被使用,就会被踢出系统。

3)slab allocation

Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。

Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab

Slab是由多个Page组成的,Page按照指定大小切割成多个chunk

技术分享

Growth Factor

memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。

通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

[root@localhost src]# memcached -u root  -vv
slab class   1: chunk size        80 perslab   13107
slab class   2: chunk size       104 perslab   10082
slab class   3: chunk size       136 perslab    7710
slab class   4: chunk size       176 perslab    5957
slab class   5: chunk size       224 perslab    4681
slab class   6: chunk size       280 perslab    3744
slab class   7: chunk size       352 perslab    2978
slab class   8: chunk size       440 perslab    2383
slab class   9: chunk size       552 perslab    1899
slab class  10: chunk size       696 perslab    1506
slab class  11: chunk size       872 perslab    1202
slab class  12: chunk size      1096 perslab     956
slab class  13: chunk size      1376 perslab     762
slab class  14: chunk size      1720 perslab     609
slab class  15: chunk size      2152 perslab     487
slab class  16: chunk size      2696 perslab     388
slab class  17: chunk size      3376 perslab     310
slab class  18: chunk size      4224 perslab     248
slab class  19: chunk size      5280 perslab     198
slab class  20: chunk size      6600 perslab     158
slab class  21: chunk size      8256 perslab     127
slab class  22: chunk size     10320 perslab     101
slab class  23: chunk size     12904 perslab      81
slab class  24: chunk size     16136 perslab      64
slab class  25: chunk size     20176 perslab      51
slab class  26: chunk size     25224 perslab      41
slab class  27: chunk size     31536 perslab      33
slab class  28: chunk size     39424 perslab      26
slab class  29: chunk size     49280 perslab      21
slab class  30: chunk size     61600 perslab      17
slab class  31: chunk size     77000 perslab      13
slab class  32: chunk size     96256 perslab      10
slab class  33: chunk size    120320 perslab       8
slab class  34: chunk size    150400 perslab       6
slab class  35: chunk size    188000 perslab       5
slab class  36: chunk size    235000 perslab       4
slab class  37: chunk size    293752 perslab       3
slab class  38: chunk size    367192 perslab       2
slab class  39: chunk size    458992 perslab       2
slab class  40: chunk size    573744 perslab       1
slab class  41: chunk size    717184 perslab       1
slab class  42: chunk size   1048576 perslab       1
<26 server listening (auto-negotiate)
<27 server listening (auto-negotiate)
<28 send buffer was 112640, now 268435456
<32 send buffer was 112640, now 268435456
<28 server listening (udp)
<31 server listening (udp)
<32 server listening (udp)
<35 server listening (udp)
<30 server listening (udp)
<29 server listening (udp)
<34 server listening (udp)
<33 server listening (udp)

Slab Allocation的缺点

Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:

每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费

每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费

按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费

 

 4)分布式、一致性hash算法

PHP中memcache的使用

标签:

原文地址:http://www.cnblogs.com/chenpingzhao/p/4681666.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!