一. Linux 下安装

    1. 首先是下载 memcached 了,目前最新版本是 1.2.1,直接从官方网站即可下载到 memcached-1.2.1.tar.gz 。
            除此之外,memcached 用到了 libevent ,我下载的 是 libevent-1.3a.tar.gz。

            memcached官方版本下载地址:http://www.danga.com/memcached/
            libevent官方版本下载地址:http://monkey.org/~provos/libevent/

    2. 接下来是分别将 libevent-1.3a.tar.gz 和 memcached-1.2.1.tar.gz 解开包、编译、安装:
            我安装memcached 在 /usr/bin/memcached位置。复制内容到剪贴板代码:            # tar -xzf libevent-1.3a.tar.gz
            # cd libevent-1.3a
            # ./configure --prefix=/usr
            # make
            # make install
            # cd ..
            # tar -xzf memcached-1.2.1.tar.gz
            # cd memcached-1.2.1
            # ./configure --prefix=/usr
            # make
            # make installNOTE: 如果 libevent 不是安装在 /usr 目录下,那么需要把 libevent-1.2a.so.1 拷贝/链接(ls -s /usr/local/lib/libevent-1.1.so.1 /usr/lib)到 /usr/lib 中,否则memcached 无法正常加载。运行以下命令来启动 memcached。

    3. 运行 memcached 守护程序
            运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改            ):

            #/usr/bin/memcached -d -m 128 -l 192.168.1.117 -p 11211 -u nobody复制内容到剪贴板代码:           /usr/bin/memcached -d -m 128 -l 192.168.1.117 -p 11211 -u httpd
            参数解释:
            -d 以守护程序(daemon)方式运行 memcached;
            -m 设置 memcached 可以使用的内存大小,单位为 M;
            -l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
            -p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
            -u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。当然,还有其它参数可以用,man memcached 一下就可以看到了。


    4. 编译PHP configure加上 –enable-memcache[=DIR] 选项。我以前都是静态安装 PHP模块,此次 安装memcache PHP模块采用动态模块(DSO)方式

          memcache PHP模块下载地址:http://pecl.php .net/package/memcache复制内容到剪贴板代码:          # tar -vxzf memcache-1.5.tgz
          # cd memcache-1.5
          # /usr/local/php/bin/phpize
          # ./configure --enable-memcache --with -php-config=/usr/local/php/bin/php-config --with-zlib-dir
          # make
          # make install

安装完后会有类似这样的提示:
          Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/

          把这个记住
          然后修改php.ini
          把
          extension_dir = "./"
          修改为
          extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/"

          并添加一行
          extension=memcache.so
   
二. Windows 下安装

  

1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached

2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装

3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

4.下载http://pecl4win.php.net/ext.php/php_memcache.dll,

请自己查找对应的php版本的文件

5. 在C:\winnt\php.ini加入一行 ‘extension=php_memcache.dll’

6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!



三、 memcache与memcached的比较

    memcached 会比 memcache 多几个方法,使用方式上都差不多。

    http://stackoverflow.com/questions/1442411/using-memcache-vs-memcached-with-php

    memcached 实现了更多的 memcached 协议(毕竟是基于 libmemcached 库的)。

    http://serverfault.com/questions/63383/memcache-vs-memcached

   

memcached 的版本比较新,而且使用的是 libmemcached 库。libmemcached 被认为做过更好的优化,应该比 php only 版本的 memcache 有着更高的性能。

这里有另外一个对比表,很明显,用 memcached 会让人放心很多:
http://code.google.com/p/memcached/wiki/PHPClientComparison
差别比较大的一点是,memcached 支持 Binary Protocol,而 memcache 不支持,意味着 memcached 会有更高的性能。不过,还需要注意的是,memcached 目前还不支持长连接:在这里,我推荐大家使用 memcached三、 membercache服务端的一些参数

memcached的基本设置

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB(设置MEMCACHE大小)
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

MEMCACHE测试代码

<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)\n";
$get_result = $memcache->get('key');
echo "Data from the cache:\n";
var_dump($get_result);
?>

运行后输出如下:

Server's version: 1.2.6 Store data in the cache (data will expire in 10 seconds) Data from the cache: object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }

php.ini中的配置:
[Memcache]
; 一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,
; 它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
; 是否在遇到错误时透明地向其他服务器进行故障转移。
memcache.allow_failover = On
; 接受和发送数据时最多尝试多少个服务器,只在打开memcache.allow_failover时有效。memcache.max_failover_attempts = 20
; 数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。
; 如果发现无法解释的速度降低,可以尝试将此值增加到32768。
memcache.chunk_size = 8192
; 连接到memcached服务器时使用的默认TCP端口。
memcache.default_port = 11211
; 控制将key映射到server的策略。默认值"standard"表示使用先前版本的老hash策略。
; 设为"consistent"可以允许在连接池中添加/删除服务器时不必重新计算key与server之间的映射关系。
;memcache.hash_strategy = "standard"; 控制将key映射到server的散列函数。默认值"crc32"使用CRC32算法,而"fnv"则表示使用FNV-1a算法。
; FNV-1a比CRC32速度稍低,但是散列效果更好。
;memcache.hash_function = "crc32"
;memcache也可以作为session的存储模块,具体参看:memcache PHP 的 session.save_handler.

Memcache的安全

我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被***,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止***的***或者数据的泄露。

内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接

设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

 

Memcache的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。

分布式应用
Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有 User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎 Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。

但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。

减少数据库压力
这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如 MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。

我考虑的一种简单方法:
后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。


收藏于 2011-04-08

来自于百度空间