memcached
首先memcached是一个高性能的分布式内存对象缓存系统,用于动态的web应用,用来减轻数据库的负载。属于一种nosql。用来减少对数据库的读取次数,从而提高动态、数据库驱动网站的速度。memcached基于一个存储键值对key/value的hashmap。随着微信,微博等等应用的火爆,往往点赞,或者粉丝的数量不停的加一,要是不停的因为这个而频繁读写数据库,那对数据库将带来巨大无比的压力。
首先看看打开一个站点需要多少个请求。
这里只是打开了腾讯的首页,就一下子发出了这么多个请求。
接下来就是memcache了。memcache是个典型的key:value。就相当于字典一样。
但是要把web的对象缓存起来是什么意思呢。其实就是key就是uri路径。而uri对应的数据就是value。
memcache及支持纯文本又支持二进制。
memcached是一个内存缓存服务器。并不实现持久缓存。
但存在内存中,就有内存碎片问题。为了解决内存碎片问题,其实在linux内核中为了解决内存碎片,有两个机制
buddy system(伙伴系统) 避免内存外部碎片
slab allocator(slab分配器)就是重复使用一段页面(4k)。slab将内存的页面分为已用的和空闲的(为inode,进程等提前都编好了座)。
当然memcached的是否使用,需要php,c++等程序去调用,就是memcached是个服务,但用不用取决与程序员是否去调用。
看看memcached的站点吧。
他本身是事件驱动的,依赖于libevent这个库。
[root@localhost ~]# rpm -q libevent
libevent-1.4.13-4.el6.x86_64
[root@localhost ~]#
编译memcached。
先安装libevent
[root@master Downloads]# tar xf libevent-2.0.21-stable.tar.gz
[root@master Downloads]# cd libevent-2.0.21-stable
[root@master libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent
[root@master libevent-2.0.21-stable]# make && make install
编译memcached
[root@master Downloads]# tar xf memcached-1.4.15.tar.gz
[root@master Downloads]# cd memcached-1.4.15
[root@master memcached-1.4.15]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@master memcached-1.4.15]# make && make install
看看编译后都生成了什么。
[root@master memcached-1.4.15]# cd /usr/local/memcached/
[root@master memcached]# ls
bin include share
[root@master memcached]#
其中有个命令叫做memcached。
-p <num> 指定tcp的监听端口
-U <num> 指定udp的监听端口
-s <file> 监听在unix套接字上
-d 使用服务的形式运行。
-m <num> 指定缓存的最大内存空间
-n <bytes>指定最小的slab chunk大小
启动memcached。
[root@master bin]# /usr/local/memcached/bin/memcached -m 100 -u nobody -d
[root@master bin]# ss -alt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::memcache :::*
LISTEN 0 128 *:memcache *:*
LISTEN 0 128 *:rquotad *:*
LISTEN 0 128 :::sunrpc :::*
LISTEN 0 128 *:sunrpc *:*
使用telnet去连接那个端口11211.
[root@master bin]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
add mykey 0 30 5
hello
STORED
安装memcache的PHP扩展。
[root@nginx Downloads]# tar xf memcache-2.2.5.tgz
[root@nginx Downloads]# cd memcache-2.2.5
[root@nginx memcache-2.2.5]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
[root@nginx memcache-2.2.5]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
[root@nginx memcache-2.2.5]# make && make install
编译后得到的一个路径,这个很重要,需要记下来。
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/
创建目录。并创建配置文件。
[root@nginx memcache-2.2.5]# mkdir /etc/php.d
[root@nginx memcache-2.2.5]# vim /etc/php.d/memcache.ini
/etc/php.d/memcache.ini的内容如下。
extension=/usr/local/php/lib/php/extensions/no-debug-zts-20100525/memcache.so
编辑一个php的测试页。
<?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);
?>
test.php (END)
再复制一个php缓存的监控页面过来。(这个页面在memcache的源码包里。修改里面的访问主机地址)
[root@nginx memcache-2.2.5]# cp /root/Downloads/memcache-2.2.5/memcache.php /usr/html/
通过反复访问测试页,发现缓存的集中率明显变高了。
nginx配置memcache的方法。
location / {
root html;
index index.php index.html index.htmi;
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
default_type text/html;
}