第一章 集群后端的共享会话
方法1.ip_hash
nginx的调度算法ip_hash 缺点:导致负载不均
方法2.memcached
memcached做共享会话session
方法3.cookies
cookies 优点可以大并发,缺点:容易篡改。
第二章 memcached服务安装
1. libevent(epoll模型,libevent作为事件通知机制)
yum install libevent-devel -y
2. 安装memcached服务
yum install memcached -y
3. 启动服务并检查
[root@CentOS7-111 ~]# memcached -m 16m -c 2048 -u root -p 11211 -d
[root@CentOS7-111 ~]# ss -lntup|egrep 11211
udp UNCONN 0 0 *:11211 *:* users:(("memcached",pid=3946,fd=28))
udp UNCONN 0 0 :::11211 :::* users:(("memcached",pid=3946,fd=29))
tcp LISTEN 0 128 *:11211 *:* users:(("memcached",pid=3946,fd=26))
tcp LISTEN 0 128 :::11211 :::* users:(("memcached",pid=3946,fd=27))
第三章 存取数据测试
1. telnet交互模式
[root@mysql01_51 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set k1 0 0 6
oldboy
STORED
get k1
VALUE k1 0 6
oldboy
END
delete k1
DELETED
get k1
END
2. nc非交互模式
printf "set key008 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211
printf "get key008\r\n"|nc 127.0.0.1 11211
printf "delete key008\r\n"|nc 127.0.0.1 11211
第四章 安装客户端在php服务器
php安装详情见http://blog.csdn.net/qunchao_blog/article/details/75220030
1. 编译安装memcache
axel http://pecl.php.net/get/memcache-2.2.7.tgz
tar zxf memcache-2.2.7.tgz
cd memcache-2.2.7
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make
make install
2. 查看extension是否有.so文件
[root@web02-8 tools]# ll /application/php/lib/php/extensions/no-debug-non-zts-20121212/
total 284
-rwxr-xr-x 1 root root 289296 Jul 21 20:43 memcache.so
3. 编写php站点目录
mkdir -p /application/nginx/conf/blog/
cd /application/nginx/conf/blog/
[root@web02-8 blog]# vim a.php
<?php
phpinfo();
?>
4. 修改php.ini配置文件
sed -i '/extension_dir/s#./#/application/php/lib/php/extensions/no-debug-non-zts-20121212/#g' /application/php/lib/php.ini
sed -i '717iextension = memcache.so' /application/php/lib/php.ini
pkill php-fpm
/application/php/sbin/php-fpm
5. 网页查看是否有memcache
http://blog.etiantian.org/a.php
6. 连接到memcached服务端
1. 测试连接到memcached服务端
cd /application/nginx/html/blog
vim aaa.php
<?php
$memcache = new Memcache;
$memcache->connect('10.0.0.51', 11211) or die ("Could not connect Mc server");
$memcache->set('key', 'oldboy book');
$get= $memcache->get('key');
echo $get;
?>
chown www.www aaa.php
http://blog.etiantian.org/aaa.php
2. 安装memadmin
cd /home/oldboy/tools/
axel http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
tar xfC memadmin-1.0.12.tar.gz /application//nginx/html/blog/
http://blog.etiantian.org/memadmin/index.php
第五章 内存管理机制
1. memcached采用了如下机制:
采用slab内存分配机制。
采用LRU对象清除机制。
采用Hash机制快速检索item。
2. memcached的内存管理机制
【1】memcached的早期内存管理机制为malloc(动态内存分配)。
【2】malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。
【3】slab内存分配机制可以解决内存碎片的问题。
【4】memcached服务的内存预先分隔成特定长度的内存块,成为Chunk,用于缓存数据的内存空间或内存块,相当于磁盘的block,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。
【5】Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每个Slab Class包含多个相同大小的chunk。
【6】Slab机制也有缺点,例如,chunk的空间会浪费等。
3. 内存结构小结:
总结:memcached采用slab内存管理机制,是由多个slab模块组成,每个slab模块默认大小为1M,模块下面又分为多个slab class模块,slab class模块又分为多个chunk组成,每个chunk大小不一样,当用户存入数据的时候会匹配合适的chunk存入数据,以免减少空间浪费。
4. memcached检测对象过期机制
首先要知道,Memcached不会主动监测item对象是否过期,而是在进行get操作时检查item对象是否过期以及是否应该删除! 因为不会主动监测item对象是否过期,自然也就不会释放已分配对象的内存空间了,除非为添加的数据设定过期时间或内存缓存满了,在数据过期后,客户端不能通过key取出它的值,其存储空间将被重新利用。
Memcached使用的这种策略为懒惰检测对象过期策略,即自己不监控存入的key/value对是否过期,而是在获取key值时查看记录的时间戳,从而检查key/value对空间是否过期,这种策略不会再过期检测上浪费CPU资源。
5. memcached懒惰删除对象机制
当删除item对象时,一般不会释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候直接使用。
Memcached在分配空间时,会有限使用已经过期的key/value对空间,若分配的内存空间占满,Memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,从而将其空间分配给新的key/value对,在某些情况下(完整缓存),如果不想使用LRU算法,那么可以通过-M参数来启动Memcached,这样,Memcached在内存耗尽时,会返回一个报错信息。
6. 删除机制小结
不主动检测item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除。
当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候直接使用。
当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除。
数据存入可以设定过期时间,但是数据过期后不会被立即删除,而是在get时检查item对象是否过期以及是否应该删除。
如果不希望系统使用LRU算法清楚数据,可以使用-M参数。