06.14 memcached缓存服务

来源:互联网 发布:python自然语言处理库 编辑:程序博客网 时间:2024/05/17 08:06

第一章 集群后端的共享会话

方法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 11211udp    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 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set k1 0 0 6      oldboySTOREDget k1VALUE k1 0 6oldboyENDdelete k1       DELETEDget k1END

2. nc非交互模式

printf "set key008 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211printf "get key008\r\n"|nc 127.0.0.1 11211printf "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.tgztar zxf memcache-2.2.7.tgzcd memcache-2.2.7/application/php/bin/phpize./configure  --enable-memcache  --with-php-config=/application/php/bin/php-configmakemake 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<?phpphpinfo();?>

4. 修改php.ini配置文件

sed -i '/extension_dir/s#./#/application/php/lib/php/extensions/no-debug-non-zts-20121212/#g' /application/php/lib/php.inised -i '717iextension = memcache.so'  /application/php/lib/php.inipkill 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.phphttp://blog.etiantian.org/aaa.php

2. 安装memadmin

cd /home/oldboy/tools/axel http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gztar 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参数。