案例1:构建memcached服务
案例2:LNMP+memcached
案例3:PHP的本地Session信息
案例4:PHP实现session共享
memcache简介及理论基础:
关系型数据库:mysql mariadb
    RDBMS即关系数据库管理系统(Relational Database Management System)
NoSQL,泛指非关系型的数据库
    kv key=vaule数据库
    redis mongdb  
传统web架构的问题:
    许多web应用都将数据保存到RDBMS中,应用从服务器中读取数据并在浏览器中显示
    随着数据量的增大,访问的集中就会出现RDBMS负载加重,数据响应恶化,网站显示延迟等重大影响
数据储存位置对比
    性能:CPU缓存>内存>磁盘>数据库
    价格:CPU缓存>内存>磁盘>数据库
memcached是高性能的分布式缓存服务器
    用来集中缓存数据库查询结果,减少数据库访问次数来提高动态web响应速度
    官网:http://memcached.org/
内存管理机制:
    传统的内存分配机制
        使用完通过分配的内存后回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率
    slab allocation机制
        按照预先规定的大小,将分配的内存分割成特定长度的内存块(chunk)再把尺寸相同的内存块分成组(chunk集合)这些内存不会释放,可以重复利用
memcached使用名为least recently used(LRU)机制来分配空间
    删除“最近最少使用”的记录
    当memcached的内存空间不足时,从最近未被使用的记录中搜索,并将其空间分配给新的记录
/usr/lib/systemd/system/   这个是systemctl的配置(启动脚本)文件的目录。
    这个目录下有对应的服务才能启动服务成功 systemctl start memcached  有这个能启动
    这个命令所有选项都是在这个目录下的脚本文件所影响的,可以把nginx加入进来用这个启,参考Apache模板。
ExecStart(函数连接)=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
/etc/sysconfig/memcached

构建memcached服务
安装memcached软件,并启动服务
使用telnet测试memcached服务
对memcached进行增、删、改、查等操作
    yum -y  install   memcached
    memcached配置文件(查看即可,不需要修改)
        vim /usr/lib/systemd/system/memcached.service
        ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
        vim /etc/sysconfig/memcached
            PORT="11211"
            USER="memcached"
            MAXCONN="1024"
            CACHESIZE="64"
            OPTIONS=""
    启动服务并查看网络连接状态验证是否开启成功
        systemctl  start  memcached
        systemctl  status  memcached
        netstat  -anptu  |  grep memcached  端口号11211
    使用telnet访问memcached服务器
        yum -y install telnet
        telnet  192.168.4.5  11211
            add name 0 180 10   //变量不存在则添加
            set name 0 180 10   //添加或替换变量
            replace name 0 180 10   //替换
            get name    //读取变量
            append name 0 180 10    //向变量中追加数据
            delete name //删除变量
            stats   //查看状态
            flush_all   //清空所有
            STAT get_hits 14  hits 击中(成功)了14次
            STAT get_misses 7  失败  7次
            提示:0表示不压缩,180为数据缓存时间,10为需要存储的数据字节数量。
    缓存过期时间:
    人搜索   缓存20个 数据库
    用户传视频  (音乐) ————youku
    人搜索   缓存20个 数据库
    1小时后
    人搜索   缓存21个 数据库     
####################################################################
LNMP+memcached:
部署LNMP实现PHP动态网站架构
为PHP安装memcache扩展
创建PHP页面,并编写PHP代码,实现对memcached的数据操作
    安装源码包的依赖包 
    yum -y install gcc openssl-devel pcre-devel zlib-devel
    安装完成nginx并启服务
    cd lnmp_soft/
    cd nginx-1.12.2/
    useradd -s /sbin/nolgin/ nginx 
    ./configure --help
    ./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx --with-http_ssl_module --with-stream
    make && make install
    ln -s /usr/local/nginx/sbin/nginx /sbin/
    nginx
    netstat -natulp |grep 80
    修改配置文件实现动静分离
    location / {
            root   html;
            index  index.php  index.html   index.htm;
        }
     location  ~  \.php$  {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
           # fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;
        }
    安装php php-mysql(调用mariadb数据库的模块)
    php-fpm  php-pecl-memcache  (调用memcache数据库的模块)
    cd php_scripts/
    yum -y install  php  php-mysql
    yum -y install php-pecl-memcache
    yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
    安装mariadb(客户端) mariadb-server(服务端) mariadb-devel(依赖包)
    yum -y install  mariadb  mariadb-server  mariadb-devel
    安装nosql数据库
    yum -y install memcached
    启服务和关防火墙
    nginx mariadb php-fpm memcached 服务
    nginx
    systemctl restart mariadb
    systemctl enable mariadb
    systemctl restart php-fpm
    systemctl enable php-fpm
    systemctl restart memcached.service 
    systemctl enable memcached
    setenforce 0
    firewall-cmd --set-default-zone=trusted
    验证:
    cp mem.php  /usr/local/nginx/html
    curl 192.168.2.111/mem.php (结果为test)
####################################################
PHP的本地Session信息
    部署Nginx为前台调度服务器
    调度算法设置为轮询
    后端为两台LNMP服务器
    部署测试页面,查看PHP本地的Session信息
        会员卡ID001
        人--------------------------------------》超市会员『登记信息』
                        001.txt信息   
                        002.txt信息
                        002.txt信息
        会员卡ID002
        人--------------------------------------》超市会员『登记信息』
                        001.txt信息   
                        002.txt信息
                        002.txt信息
        会员卡ID003
        人--------------------------------------》超市会员『登记信息』
                        001.txt信息   
                        002.txt信息
                        002.txt信息
        firefox----------------------->登陆Session信息
        (cookie=001)        001.txt信息   
                        002.txt信息
                        002.txt信息
    ip_hash解决:
                                                               web1  id1.txt{信息}
        user(IP)   proxy(代理)         web2  id2.txt{信息}  公共服务器
                                                                web3  id3.txt{信息}
        cookie="Hm_lvt...sessionid=287679e630584099aa29780a0f7658bd%7CP%23375184726%40qq.com%7C%7C1%7C0%7C0%7C%7C0%7C0%7C0"
            //浏览器中可以看到sessionid。
步骤:
    部署后端LNMP服务器相关软件(两台后端服务器操作相同)
        //实现动静分离即可   不必安装memcached
    启动LNMP服务器相关的服务并关闭防火墙
    部署前端Nginx调度服务器
        安装nginx软件
        修改Nginx配置文件实现调度
        nginx -s reload
        关闭SELinux、防火墙
        curl  http://192.168.4.5/index.html  //测试
    部署后端LNMP服务器测试页面(两台后端服务器操作相同)
            //可用修改index.php和home.php两个文件的内容,添加页面颜色属性
              以区别后端两台不同的服务器:<body bgcolor=blue>
        cd lnmp_soft/php_scripts/
        tar -xf php-memcached-demo.tar.gz
        cd php-memcached-demo
        cp -a  *  /usr/local/nginx/html/
            修改默认首页
            location / {
                 root   html;
                    index  index.php index.html index.htm;  
                //这个是以顺序来找的,第一个没找到就找第二个。
                     }
        firefox http://192.168.2.100            //填写账户信息
                //这步测试时只能访问后端的web不能访问代理
                而且要清空流量器的缓存才能 在/var/lib/php/session/下记录ID2 ID3等
        ls /var/lib/php/session/            //查看服务器本地的Session信息
            sess_ahilcq9bguot0vqsjtd84k7244   //注意这里的ID是随机的
    浏览器访问前端调度器测试(不同后端服务器Session不一致)
        google-chrome http://192.168.4.5    //推荐用google
            //填写注册信息后,刷新,还需要再次注册,说明两台计算机使用的是本地Session
            //第二台主机并不知道你再第一台主机已经登录,第一台主机的登录信息也没有传递给第二台主机
            //实际情况是:能进入登录后跳转界面,一刷新会由web1变到web2,且能看出用户名不一样!!!
            Welcome : haha 
            Welcome : xixi 
            这里的用户名会变化 意味着你之前登陆的用户名和帐号在另外一台web服务器上不生效了。
PHP实现session共享(续上实验)
Nginx服务器除了承担调度器外,还需要担任memcached数据库的角色,并在两台后端LNMP服务器上实现PHP的session会话共享
在上实验前端Nginx调度服务器上再搭建memcache服务器
    安装Memcached服务
    启动服务并查看网络连接状态验证是否开启成功
    关闭SELinux、防火墙
在后端LNMP服务器上部署Session共享
    yum -y install php-pecl-memcache
    //因为后端两台web服务器(web1,web2)都需要连接memcached数据库,所以两台主机都需要安装PHP扩展模块
vim  /etc/php-fpm.d/www.conf            //修改该配置文件的两个参数
    //文件的最后2行
    修改前效果如下:
    php_value[session.save_handler] = files
    php_value[session.save_path] = /var/lib/php/session
    //原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    修改后效果如下:
    php_value[session.save_handler] = memcache
        #把php的值session对话信息交给谁处理 处理者(handler)是memcache
    php_value[session.save_path] = "tcp://192.168.2.5:11211"
        #传输对话信息的路径是通过tcp协议传给memcache服务器的11211这个端口
    //定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
    //通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
systemctl  restart  php-fpm原文:http://blog.51cto.com/13659481/2130206