精华内容
下载资源
问答
  • Memcached

    千次阅读 2020-03-19 11:38:58
    memcached是一种高性能 ,分布式的内存对象缓存系统,是由livejounal 旗下的 danga 公司开发的老牌 NoSQL 应用,memcached将数据缓存在内存中,提升访问速度,减少数据库压力。 何为NoSQL NoSQL=not only sql 不仅仅是...

    简介

    memcached是一种高性能 ,分布式的内存对象缓存系统,是由livejounal 旗下的 danga 公司开发的老牌 NoSQL 应用,memcached将数据缓存在内存中,提升访问速度,减少数据库压力。

    何为NoSQL

    NoSQL=not only sql 不仅仅是(关系型)数据库,相对于传统的关系型数据库的行列规范,NoSQL的鲜明特点为k-v存储(memcached,redis),或者基于文档存储(mongodb)。

    Memcached+mysql

    1.在没有memcached的情况下,客户端访问服务器有关数据操作全部经过mysql,重复性的增删查改增加了mysql的压力甚至出现崩溃
    2.Memcached+mysql
    当客户端第一次访问服务器时,服务器将数据从数据库中查询出来并将这些数据缓存到Memcached服务器中
    当客户端第二次访问服务器时先判断缓存中是否有相关数据,有则使用缓存的数据,这样减轻了数据库服务器的压力。

    Linux搭建Memcached

    https://editor.csdn.net/md?articleId=104962866

    Memcachedn内存管理机制

    memcached通过 slab allocator来缓解内存的碎片化—内存碎片
    slab allocator的工作原理:
    预先把内存划分为数个slab class库(每个slab class 大小为1M),各个(slab class)库被切分成不同尺寸的小块(chunk),需要存内容的时候,判断内容的大小,为其选取合理的(slab class)库。
    在这里插入图片描述
    当我们需要存储数据时,会判断数据的大小选择合适的chunk组(slab class),将数据存储到chunk中,假设你有一个100k的数据则该数据会存储到 122chunk组中,如果122chunk组的空间满了,该数据并不会存储在144或者其他chunk中,memcached会根据LRU删除机制(最近很少使用)删除最近很少使用的数据从而将新的数据存储到chunk中,这里有个问题就是,通过LRU删除机制会删除原来存储在chunk中的数据,解决办法就是永久型数据于非永久性数据分开放。

    固定大小的chunk带来的内存浪费
    如上图,由于slab allocator机制中,分配chunk大小是’固定’的,因此,对于特定的item,可能造成内存空间的浪费.
    比如,将100字节的数据缓存到122字节的chunk中,剩余22字节就浪费了
    如何缓解这种问题?
    我们可以对存储的数据进行统计计算,制定合理的chunk的大小,但这里我们不能直接指定chunk的大小 我们可以通过memcached的参数调整chunk的增长速度 -f 增长因子,默认为1.25

    如下
    m参数分配给memcached存储缓存的内存大小默认64m
    p参数设置memcached的端口默认11211
    f参数设置chunk的增长如96,192,384…默认1.25
    vv显示内存分配情况
    u指定用户启动
    在这里插入图片描述
    可以看到每个chunk成倍的增长 perslab代表slabclass的chun有几个chunk的大小*chunk个数=1m

    memcached分布式集群算法

    由于memcached节点之间,是不互相通信的.因此,memcached的分布式,是靠用户设计算法,把数据分布在多个memcached节点中分布式其实就是多台服务器分配工作量的方法。

    1.取模算法:根据键求得得到其整数散列值,在根据这个值除以服务器的数量,根据相应的余数选择相应的服务器,特点:(简单,高效,扩展性差由于数据存储的服务器直接跟服务器数量有关,只要服务器数量发生变更,直接导致所有缓存数据失效)。

    2.一致性哈希算法:
    通俗的理解一致性哈希算法,我们可以把各服务器节点映射放在钟表的各个时刻上, 把 key 也映射到钟表的某个时刻上.
    该 key 沿钟表顺时针走,碰到的第 1 个节点,即为该 key 的存储节点
    在这里插入图片描述
    上述一致性哈希算法也有缺点,当某个节点失效后,那么根据顺时针规则,原本该节点承受的压力会立即转换到和他相邻的节点,这样相邻的节点也会慢慢随之失效一直循环会导致整个圆环上的节点都失效。
    我们想如果某个节点失效了,能不能将其承受的压力平均的分配给每个节点,这样就不会出现连环失效的情况

    虚拟节点
    有N个真实节点,把每个真实节点映射成M个虚拟节点,再把M*N个虚拟节点,散列在圆环上,各个真实节点对应的虚拟节点相互交错分布这样,某真实节点down后,则把其影响均匀分摊到其他的所有节点之上.
    在这里插入图片描述
    memcached常用参数与命令
    参数:
    m:设置memcached最大缓存大小
    f:设置增长因子
    u:运行memcached的用户
    p:memcached的端口默认11211
    c:最大并发连接数 默认1024
    f:增长因子默认1.25
    vv:显示详细信息
    vvv:显示超详细信息
    h:帮助信息
    命令
    add key flag expire length
    flag:数据类型标记(int)
    expire:数据有效期秒为单位也可接收时间戳(默认0永久有效)
    length:数据字节长度
    delete key
    删除指定的key
    get key
    获取指定的key
    replace key flag expire length
    替换对应的键
    set key flag expire length
    有key则修改没有则创建

    incr key num
    递增num
    decr key num
    递减num
    统计命令
    使用stats命令可以将memcached当前的运行信息统计出来
    stats
    STAT pid 进程号
    STAT uptime 持续运行的时间
    STAT time 服务器当前的unix时间、
    STAT version 服务器版本号
    STAT libvent libvent的版本号
    STAT pointer_size 服务器操作系统位数
    STAT curr_connection 当前连接数
    STAT total_connections:总连接数
    STAT cmd_get:获取请求数量
    STAT get_his:获取成功次数
    STAT get_misses 失败次数
    根据上面三个可得出命中率
    命中率:(查询到的数据的次数/查询综述)*100%;
    STAT cmd_set 存储请求数量
    STAT cmd_flush flush请求的数量
    STAT cmd_touch touch请求的数量
    STAT delete_hits 删除的命中
    STAT delete_misses 删除失败的次数

    STAT bytes:已用缓存空间
    STAT bytes_read :总共获取数量
    STAT bytes_written 总写入数据数
    STAT curr_items:当前缓存item数量
    STAT total_items:总缓存数量

    展开全文
  • memcached

    千次阅读 2018-07-02 19:14:07
    memcached 1.memcached 简介Memcached是一款开源的,高性能的纯内存缓存服务软件,Mem是内存的意思,cache是缓存的意思,d是daemon的意思 Memcached是项目的名字,诞生于2003年,Memcached服务分为客户端和服务端两...

    memcached 

    1.memcached 简介

    MySQL
    关系型数据库
    数据存储在磁盘的
    定位:数据仓库
    Memcache
    缓存数据库:memcache redis
    NOSQL数据库  not only SQL  非关系型数据库
    数据是存储在内存,内存速度远远快于磁盘  
    memcached的读取写入都是远远高于mysql这种关系型数据库的
    数据库的并发:memcached 10w >>>>> mysql 1k
    memcache缺点就是内存缺点:断电数据丢失
    企业常用架构:Mysql+memcached  互补的
    Redis  工作区域在内存,定时将内存数据保存到磁盘文件中 Mysql+redis
    Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。
    C/S  client/server
    B/S  browser浏览器/server 
    Memcached是一款开源的,高性能的纯内存缓存服务软件,Mem是内存的意思,cache是缓存的意思,d是daemon的意思

    Memcached是项目的名字,诞生于2003年,Memcached服务分为客户端和服务端两部分,C/S架构。


    1.1  Mysql+memcahed工作场景

    业务数据存储在MySQL中

    以前的情况:程序是直接读取mysql数据库

    现在数据读取流程:
    步骤1:memcache没有任何数据,程序只能到数据库读取,首先会把数据返回给用户,其次,会将这个数据缓存到memcached
    步骤2:程序会先判断这个数据是否在memcached中,如果在,直接从memcached中读取数据返回给用户,如果没有,那再次执行步骤1
    更好的解决方法:将mysql中先全部缓存到memcache,,这个过程叫做预热

    客户端软件Memcache-2.25.tar.gz

    服务端软件memcached-1.4.13.tar.gz

    2. 检查环境

    [root@web01 ~]# cat /etc/redhat-release 
    CentOS release 6.9 (Final)
    [root@web01 ~]#  uname -r
    2.6.32-696.el6.x86_64
    [root@web01 ~]#  getenforce 
    Disabled
    [root@web01 ~]# /etc/init.d/iptables status
    iptables: Firewall is not running.
    

    2.1 安装

    [root@web01 ~]# yum -y install memcached
    [root@web01 ~]# rpm -ivh https://mirrors.aliyun.com/centos/6/os/x86_64/Packages/memcached-1.4.4-5.el6.x86_64.rpm
    

    2.3 启动

    [root@web01 ~]# /etc/init.d/memcached start
    Starting memcached:                                        [  OK  ]
    [root@web01 ~]# netstat -tplun|grep memcache
    tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      1483/memcached      
    tcp        0      0 :::11211                    :::*                        LISTEN      1483/memcached      
    udp        0      0 0.0.0.0:11211               0.0.0.0:*                               1483/memcached      
    udp        0      0 :::11211                    :::*                                    1483/memcached   
    

    2.4 如果没有nc命令 使用yum安装

    [root@web01 ~]# rpm -ivh https://mirrors.aliyun.com/centos/6/os/x86_64/Packages/nc-1.84-24.el6.x86_64.rpm

    2.5 printf向memcached写入数据

    [root@web01 ~]#  printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211     #写入数据
    STORED
    [root@web01 ~]#  printf "get key008\r\n"|nc 127.0.0.1 11211  VALUE key008 0 10     #读取数据
    oldboy0987
    END
    

    2.5.1  写入数据

    ### printf :命令

    ### set  : 写值

    ### key008 :key值 (键值)

    ### 0 0 10:第一个0为标志 ,第二个0为超时时间(0为永久,永不超时), 10 为超时时间 (默认为s)

    ### \r\n: 换行符的意思

    ### noldboy0987 :为写入的数据

    根据自己设定的键值:key008  开读取写入的数据!

    2.5.3 注意

    写入数据的长度一个要对, 不然存不进去!

    2.5.4 例如

    [root@web01 ~]#  printf "set key009 0 10 12\r\noldboyzz0987\r\n"|nc 127.0.0.1 11211
    STORED
    [root@web01 ~]# printf "get key009\r\n"|nc 127.0.0.1 11211
    VALUE key009 0 12
    oldboyzz0987
    END
    超过10s再次读取数据
    [root@web01 ~]#  printf "get key009\r\n"|nc 127.0.0.1 11211
    END

    2.6 delete 删除数据

    [root@web01 ~]#  printf "delete key008\r\n"|nc 127.0.0.1 11211   #删除数据
    DELETED
    [root@web01 ~]# printf "get key008\r\n"|nc 127.0.0.1 11211    #读取key008数据,已经没有
    END
    

    2.7 查看命中率

    [root@web01 ~]#  printf "stats\r\n"|nc 127.0.0.1 11211|grep hit
    STAT get_hits 2
    STAT delete_hits 1
    STAT incr_hits 0
    STAT decr_hits 0
    STAT cas_hits 0
    

    2.8 安装memcached服务器

    ## 安装 memcached服务端 要找相对应服务的模块 例如:php—服务,就要找相对应php服务的模块安装

    2.8.1 把安装包放在目录下

    [root@web01 tools]# ll
    
    total 337376
    
    drwxr-xr-x 22 root   root           4096 Jun 26 09:15 libiconv-1.14
    
    -rw-r--r-- 1 root   root        4984397 Jul  5 15:07 libiconv-1.14.tar.gz
    
    -rw-r--r--  1 root  root          35981 Jul 28 2017 memcache-2.2.5.tgz
    
    -rw-r--r-- 1 root   root      314149697 Jul  5 15:09mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz.0
    
    drwxr-xr-x 17   1001     1001      4096 Jun 26 09:20php-5.5.32
    
    -rw-r--r-- 1 root   root       17773092 Jul  5 15:06 php-5.5.32.tar.gz
    
    drwxr-xr-x 2 nobody nfsnobody      4096 Jun26 12:22 wordpress
    
    -rw-r--r--  1 root   root       8507412 Apr 23 21:24 wordpress-4.7.4-zh_CN.tar.gz

    2.8.2 安装

    tar zxvf memcache-2.2.5.tgz
    cd memcache-2.2.5
    /application/php/bin/phpize
    ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
    make
    make install 
    [root@web01 memcache-2.2.5]#  ls /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
    memcache.so
    

    2.9 更改配置文件

    [root@web01 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
    [root@web01 memcache-2.2.5]# pkill php
    [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm -t[18-Jul-2017 09:07:01] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
    
    [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm
    [root@web01 memcache-2.2.5]# /application/php/bin/php -m|grep memcache
    memcache
    ###  显示 memcache 就表示模块添加成功了!
    

    2.10 测试

    [root@web01 memcache-2.2.5]# cat /application/nginx/html/blog/mc.php 
    <?php
        $memcache = new Memcache;
        $memcache->connect('127.0.0.1 ', 11211) or die ("Could not connect");
        $memcache->set('key20170728', 'oldboy0326');
        $get_value = $memcache->get('key20170728');
        echo $get_value;
    ?>
    
    [root@web01 memcache-2.2.5]# sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path = "tcp://127.0.0.1:11211"' /application/php/lib/php.ini
    [root@web01 memcache-2.2.5]# pkill php
    [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm -t[18-Jul-2017 09:10:29] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
    
    [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm
    
    [root@web01 memcache-2.2.5]# cat >>/application/nginx/html/blog/sess.php<<"EOF"
    > <?php  
    > session_start();  
    > if (!isset($_SESSION['TEST'])) {  
    >     $_SESSION['TEST'] = time();  
    > }  
    >    
    > $_SESSION['TEST3'] = time();  
    >    
    > print $_SESSION['TEST'];  
    > print "<br><br>";  
    > print $_SESSION['TEST3'];  
    > print "<br><br>";  
    > print session_id();  
    > ?>  
    > EOF
    
    
    [root@web01 memcache-2.2.5]# printf "get t6p5a0iredji6qv2gnrtrkn5b7\r\n"|nc 127.0.0.1 11211
    END
    
    
    [root@web01 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
    登录网址
    http://blog.etiantian.org/memadmin/
    



    展开全文
  • MemCached

    千次阅读 2019-04-22 15:47:10
    MemCached原理 许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示 随着数据量的增大,访问的集中,就会出现RDBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响 数据库存储...

    MemCached原理

    • 许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示
    • 随着数据量的增大,访问的集中,就会出现RDBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响

    数据库存储位置对比

    • 性能: CPU缓存>内存>磁盘>数据库
    • 价格: CPU缓存>内存>磁盘>数据库

    Memcached简介

    memecached是高性能的分布式缓存服务器

    • 用来集中缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的响应速度
    • 官方网站:http://memcached.org/

    内存管理机制

    1. 传统内存分配机制
    • 使用完通过分配的内存后回收内存,这种方式易产生内存碎片并降低操作系统对内存的管理效率
    1. Slab Allocation机制
    • memcached使用这种内存管理机制,可以提高读写速度

    构建memcached服务

    • 安装memcached软件,并启动服务
    • 使用telnet测试memcached服务
    • 对memcached进行增、删、改、查等操作

    memcached是高性能的分布式缓存服务器,用来集中缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的响应速度。访问拓扑如图所示。

    在这里插入图片描述

    • 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5)。
    • 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测试时需要提前安装telnet远程工具。
    • 验证时需要客户端主机安装telnet,远程memcached来验证服务器的功能:
    1. add name 0 180 10 //变量不存在则添加
    2. set name 0 180 10 //添加或替换变量
    3. replace name 0 180 10 //替换
    4. get name //读取变量
    5. append name 0 180 10 //向变量中追加数据
    6. delete name //删除变量
    7. stats //查看状态
    8. flush_all //清空所有
      提示:0表示不压缩,180为数据缓存时间,10为需要存储的数据字节数量。

    步骤

    一:构建memcached服务

    (1)使用yum安装软件包memcached

    [root@proxy ~]# yum -y  install   memcached
    [root@proxy ~]# rpm -qa memcached
    memcached-1.4.15-10.el7_3.1.x86_64
    

    (2) memcached配置文件(查看即可,不需要修改)

    [root@proxy ~]# vim /usr/lib/systemd/system/memcached.service
    ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
    [root@proxy ~]# vim /etc/sysconfig/memcached
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""
    

    (3)启动服务并查看网络连接状态验证是否开启成功:
    netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:
    -a显示所有端口的信息
    -n以数字格式显示端口号
    -t显示TCP连接的端口
    -u显示UDP连接的端口
    -l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
    -p显示监听端口的服务名称是什么(也就是程序名称)
    注意:在RHEL7系统中,使用ss命令可以替代netstat,功能与选项一样。

    [root@proxy ~]# systemctl  start  memcached
    [root@proxy ~]# systemctl  status  memcached
    [root@proxy ~]# netstat  -anptu  |  grep memcached
    tcp    0    0 0.0.0.0:11211        0.0.0.0:*        LISTEN        2839/memcached      
    tcp    0    0 :::11211            :::*                LISTEN        2839/memcached      
    udp    0    0 0.0.0.0:11211        0.0.0.0:*                    2839/memcached      
    udp    0    0 :::11211            :::*                            2839/memcached
    [root@proxy ~]# setenforce 0
    [root@proxy ~]# firewall-cmd --set-default-zone=trusted
    

    二:使用telnet访问memcached服务器

    (1)使用yum安装telnet
    [root@proxy ~]# yum -y install telnet
    (2)使用telnet连接服务器测试memcached服务器功能,包括增、删、改、查等操作。

    [root@proxy ~]# telnet  192.168.4.5  11211
    Trying 192.168.4.5...
    ……
    ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
    set name 0 180 3                //定义变量,变量名称为name
    plj                            //输入变量的值,值为plj                
    STORED
    get name                        //获取变量的值
    VALUE name 0 3                 //输出结果
    plj
    END
    ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
    add myname 0 180 10            //新建,myname不存在则添加,存在则报错
    set myname 0 180 10            //添加或替换变量
    replace myname 0 180 10        //替换,如果myname不存在则报错
    get myname                    //读取变量
    append myname 0 180 10        //向变量中追加数据
    delete myname                    //删除变量
    stats                        //查看状态
    flush_all                        //清空所有
    quit                            //退出登录   
    

    LNMP+memcached

    部署LNMP+memcached网站平台,通过PHP页面实现对memcached服务器的数据操作

    • 部署LNMP实现PHP动态网站架构
    • 为PHP安装memcache扩展
      创建PHP页面,并编写PHP代码,实现对memcached的数据操作
      使用2台RHEL7虚拟机,其中一台作为memcached及LNMP服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.10),如图所示。
      在这里插入图片描述
      在RHEL7系统光盘中包含有我们需要的MariaDB、PHP,我们需要使用源码安装Nginx,使用RPM包安装FPM。另外如果希望使用PHP来操作memcached,注意必须要为PHP安装memcache扩展(php-pecl-memcache),否则PHP无法解析连接memcached的指令。客户端测试时需要提前安装telnet远程工具。

    一:部署LNMP环境(如果环境中已经存在LNMP环境本步骤可以忽略)

    (1)使用yum安装基础依赖包

    [root@web1 ~]# yum -y install gcc openssl-devel pcre-devel zlib-devel
    .. ..
    

    (2)源码安装Nginx

    [root@web1 ~]# tar -xf nginx-1.12.2.tar.gz
    [root@web1 ~]# cd nginx-1.12.2
    [root@web1 nginx-1.12.2]#  ./configure   \
    > --with-http_ssl_module 
    [root@web1 nginx-1.12.2]# make && make install
    

    (3)安装MariaDB数据库

    [root@web1 ~]# yum -y install  mariadb  mariadb-server  mariadb-devel
    

    (4)安装PHP

    [root@web1 ~]# yum -y install  php  php-mysql
    [root@web1 ~]# yum -y install  php-fpm-5.4.16-42.el7.x86_64.rpm
    

    (5)修改Nginx配置文件

    [root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
    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;
            }
    

    二:启动服务(如果所有服务已经启动,也可以忽略这一步骤)

    (1)启动Nginx服务
    这里需要注意的是,如果服务器上已经启动了其他监听80端口的服务软件(如httpd),则需要先关闭该服务,否则会出现冲突。

    [root@web1 ~]# systemctl stop  httpd                //如果该服务存在,则关闭该服务
    [root@web1 ~]# /usr/local/nginx/sbin/nginx
    [root@web1 ~]# netstat -utnlp | grep :80
    tcp    0    0 0.0.0.0:80        0.0.0.0:*        LISTEN        32428/nginx 
    
    

    (2)启动MySQL服务

    [root@web1 ~]# systemctl start mariadb
    [root@web1 ~]# systemctl status mariadb
    

    (3)启动PHP-FPM服务

    [root@web1 ~]# systemctl start php-fpm
    [root@web1 ~]# systemctl status php-fpm
    

    (4)关闭SELinux、防火墙

    [root@web1 ~]# setenforce 0
    [root@web1 ~]# firewall-cmd --set-default-zone=trusted
    

    三:创建PHP页面,使用PHP语言测试memcached服务

    (1)部署测试页面

    创建PHP首页文档/usr/local/nginx/html/index.php,测试页面可以参考lnmp_soft/php_scripts/mem.php。
    注意:192.168.2.5是memcached数据库。

     [root@web1 ~]# vim /usr/local/nginx/html/test.php
    <?php
    $memcache=new Memcache;                //创建memcache对象
    $memcache->connect('192.168.2.5',11211) or die ('could not connect!!');
    $memcache->set('key','test');             //定义变量
    $get_values=$memcache->get('key');        //获取变量值
    echo $get_values;
    ?>
    

    (2)客户端测试(结果会失败)
    客户端使用浏览器访问服务器PHP首页文档,检验对memcached的操作是否成功:

    [root@web1 ~]# firefox http://192.168.2.100/test.php
    

    注意:这里因为没有给PHP安装扩展包,默认PHP无法连接memcached数据库,需要给PHP安装扩展模块才可以连接memcached数据库。
    (3)为PHP添加memcache扩展

    [root@web1 ~]# yum -y install  php-pecl-memcache
    [root@web1 ~]# systemctl restart php-fpm
    

    (4)客户端再次测试(结果会成功显示数据结果)

    [root@web1 ~]# firefox http://192.168.2.100/test.php
    

    PHP的本地Session信息

    通过Nginx调度器负载后端两台Web服务器,实现以下目标:

    • 部署Nginx为前台调度服务器
    • 调度算法设置为轮询
    • 后端为两台LNMP服务器
    • 部署测试页面,查看PHP本地的Session信息

    方案

    使用4台RHEL7虚拟机,其中一台作为Nginx前端调度器服务器(eth0:192.168.4.5,eth1:192.168.2.5)、两台虚拟机部署为LNMP服务器,分别为Web1服务器(192.168.2.100)和Web2服务器(192.168.2.200),另外一台作为测试用的Linux客户机(192.168.4.10),拓扑如图所示。
    在这里插入图片描述

    步骤

    实现此案例需要按照如下步骤进行。

    一:部署后端LNMP服务器相关软件(如果已经安装完成,则忽略此步骤)

    注意:以下部署LNMP服务器的操作,需要在两台后端服务器做相同的操作,下面我们以一台Web2服务器(192.168.2.200)为例,对Web1服务器执行相同操作即可。
    (1)使用yum安装基础依赖包

    [root@web2 ~]# yum -y install gcc openssl-devel pcre-devel
    .. ..
    

    (2)源码安装Nginx

    [root@web2 ~]# tar -xf nginx-1.12.2.tar.gz
    [root@web2 ~]# cd nginx-1.12.2
    [root@web2 nginx-1.12.2]#  ./configure   \
    > --with-http_ssl_module 
    [root@web2 nginx-1.12.2]# make && make install
    

    (3)安装MariaDB数据库

    [root@web2 ~]# yum -y install  mariadb  mariadb-server  mariadb-devel
    

    (4)安装PHP(php-fpm软件包在lnmp_soft中有提供)

    [root@web2 ~]# yum -y install  php  php-mysql
    [root@web2 ~]# yum -y install  php-fpm-5.4.16-42.el7.x86_64.rpm
    

    (5)修改Nginx配置文件(修改默认首页与动静分离)

    [root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
    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;
            }
            
    

    二:启动LNMP服务器相关的服务

    (1)启动Nginx服务
    这里需要注意的是,如果服务器上已经启动了其他监听80端口的服务软件(如httpd),则需要先关闭该服务,否则会出现冲突。

    [root@web2 ~]# systemctl stop  httpd                //如果该服务存在,则关闭该服务
    [root@web2 ~]# /usr/local/nginx/sbin/nginx
    [root@web2 ~]# netstat -utnlp | grep :80
    tcp    0    0 0.0.0.0:80        0.0.0.0:*        LISTEN        32428/nginx         
    

    (2)启动MySQL服务

    [root@web2 ~]# systemctl start mariadb
    [root@web2 ~]# systemctl status mariadb
    

    (3)启动PHP-FPM服务

    [root@web2 ~]# systemctl start  php-fpm
    [root@web2 ~]# systemctl status php-fpm
    

    (4)关闭SELinux、防火墙

    [root@web2 ~]# setenforce 0
    [root@web2 ~]# firewall-cmd --set-default-zone=trusted
    

    三:部署前端Nginx调度服务器

    (1)使用源码安装nginx软件(如果Nginx软件包已存在可以忽略此步骤)

    [root@proxy ~]# yum  -y  install   gcc pcre-devel openssl-devel
    [root@proxy ~]# tar -xf nginx-1.12.2.tar.gz
    [root@proxy ~]# cd nginx-1.12.2
    [root@proxy nginx-1.12.2]# ./configure
    [root@proxy nginx-1.12.2]# make && make install
    

    (2)修改Nginx配置文件
    Nginx配置文件中,通过upstream定义后端服务器地址池,默认调度策略为轮询,使用proxy_pass调用upstream定义的服务器地址池:

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    upstream webs  {
            server 192.168.2.100:80;
            server 192.168.2.200:80;
      }
     server  {
              listen       80;
              server_name  localhost;
              location  /  {
                  proxy_pass http://webs;
                root   html;
                index  index.php index.html index.htm;
              }
    }
    

    (3)重新加载配置文件

    [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
    

    #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
    [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)
    (4)关闭SELinux、防火墙

    [root@proxy ~]# setenforce 0
    [root@proxy ~]# firewall-cmd --set-default-zone=trusted
    

    四:测试环境是否配置成功

    (1)浏览器访问测试页面验证。

    [root@client ~]# curl  http://192.168.4.5/index.html        //查看是否有数据
    

    五:部署测试页面

    (1)部署测试页面(Web1服务器)。
    测试页面可以参考lnmp_soft/php_scripts/php-memcached-demo.tar.gz。

    [root@web1 ~]# cd lnmp_soft/php_scripts/
    [root@web1 php_scripts]# tar -xf php-memcached-demo.tar.gz
    [root@web1 php_scripts]# cd php-memcached-demo
    [root@web1 php-memcached-demo]# cp -a  *  /usr/local/nginx/html/
    

    (2)浏览器直接访问后端服务器的测试页面(Web1服务器)。

    [root@web1 ~]# firefox http://192.168.2.100            //填写账户信息
    [root@web1 ~]# cd /var/lib/php/session/            //查看服务器本地的Session信息
    [root@web1 ~]# ls
    sess_ahilcq9bguot0vqsjtd84k7244                        //注意这里的ID是随机的
    [root@web1 ~]# cat sess_ahilcq9bguot0vqsjtd84k7244
    

    注意:可用修改index.php和home.php两个文件的内容,添加页面颜色属性,以区别后端两台不同的服务器:。
    (3)部署测试页面(Web2服务器)。
    测试页面可以参考lnmp_soft/php_scripts/php-memcached-demo.tar.gz。

    [root@web2 ~]# cd lnmp_soft/php_scripts/
    [root@web2 php_scripts]# tar -xf php-memcached-demo.tar.gz
    [root@web2 php_scripts]# cd php-memcached-demo
    [root@web2 php-memcached-demo]# cp -a  *  /usr/local/nginx/html/
    

    (4)浏览器直接访问后端服务器的测试页面(Web2服务器)。

    [root@web2 ~]# firefox http://192.168.2.100             //填写账户信息
    [root@web2 ~]# cd /var/lib/php/session/            //查看服务器本地的Session信息
    [root@web2 ~]# ls
    sess_qqek1tmel07br8f63d6v9ch401                        //注意这里的ID是随机的
    [root@web2 ~]# cat sess_qqek1tmel07br8f63d6v9ch401    
    

    注意:可用修改index.php和home.php两个文件的内容,添加页面颜色属性,以区别后端两台不同的服务器:。
    (5)浏览器访问前端调度器测试(不同后端服务器Session不一致)。
    推荐使用google浏览器测试。

    [root@client ~]# google-chrome http://192.168.4.5
    

    //填写注册信息后,刷新,还需要再次注册,说明两台计算机使用的是本地Session
    //第二台主机并不知道你再第一台主机已经登录,第一台主机的登录信息也没有传递给第二台主机

    PHP实现session共享

    通过修改PHP-FPM配置文件,实现session会话共享,本案例需要在练习三的基础上实现:
    配置PHP使用memcached服务器共享Session信息
    客户端访问两台不同的后端Web服务器时,Session 信息一致

    在练习三拓扑的基础上,Nginx服务器除了承担调度器外,还需要担任memcached数据库的角色,并在两台后端LNMP服务器上实现PHP的session会话共享。拓扑结构如图所示。
    在这里插入图片描述

    一:构建memcached服务

    (1)安装Memcached服务(如果192.168.4.5上已经有本软件包,此步骤可以忽略)

    [root@proxy ~]# yum -y install memcached
    

    (2)启动服务并查看网络连接状态验证是否开启成功:

    [root@proxy ~]# systemctl restart memcached
    [root@proxy ~]# netstat  -anptu  |  grep memcached
    tcp    0    0 0.0.0.0:11211        0.0.0.0:*        LISTEN        2839/memcached      
    tcp    0    0 :::11211            :::*                LISTEN        2839/memcached      
    udp    0    0 0.0.0.0:11211        0.0.0.0:*                    2839/memcached      
    udp    0    0 :::11211            :::*                            2839/memcached
    

    (3)关闭SELinux、防火墙

    [root@proxy ~]# setenforce 0
    [root@proxy ~]# firewall-cmd --set-default-zone=trusted
    

    二:在后端LNMP服务器上部署Session共享

    注意:这些操作在两台后端Web服务器上均需要执行,以下操作以Web1(192.168.2.100)服务器为例。
    (1)为PHP添加memcache扩展
    注意,因为后端两台web服务器(web1,web2)都需要连接memcached数据库,所以两台主机都需要安装PHP扩展模块(下面也web1为例)。

    [root@web1 ~]# yum -y install  php-pecl-memcache
    

    (2)修改PHP-FPM配置文件,并重启服务
    注意,因为后端两台web服务器(web1,web2)都需要修改配置文件(下面也web1为例)。

    [root@web1 ~]# 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_value[session.save_path] = "tcp://192.168.2.5:11211"
    //定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
    //通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
    [root@web1 ~]# systemctl  restart  php-fpm
    

    三:客户端测试

    客户端使用浏览器访问两台不同的Web服务器。
    操作步骤与练习三一致,最终可以获得相关的Session ID信息。

    展开全文
  • memcached

    2010-09-10 16:33:00
    一、memcached 简介 在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存...

    一、memcached 简介
    在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
    二、memcached 安装
    首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz。
    接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:   
     
    参数解释:
     

    当然,还有其它参数可以用,man memcached 一下就可以看到了。
     
    四、memcached 的工作原理
    首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

    五、PHP 如何作为 memcached 客户端
    有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
    第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
    除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
    本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
     
    六、PHP memcached 应用示例
    首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
    add ($key, $val, $exp = 0)
    往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
    get ($key)
    从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
    replace ($key, $value, $exp=0)
    使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
    delete ($key, $time = 0)
    删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
    下面是一段简单的测试代码,代码中对标识符为 "mykey" 的对象数据进行存取操作:
    // 选项设置  
    $options = array(  
      //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
      "servers" => array("192.168.1.1:11211"),   
      "debug" => true, //是否打开 debug  
      "compress_threshold" => 10240, //超过多少字节的数据时进行压缩  
      "persistant" => false //是否使用持久连接  
      );  
    // 创建 memcached 对象实例  
    $mc = new memcached($options);  
    // 设置此脚本使用的唯一标识符  
    $key = "mykey";  
    // 往 memcached 中写入对象  
    $mc->add($key, "some random strings");  
    $val = $mc->get($key);  
    echo "n".str_pad("$mc->add() ", 60, "_")."n";  
    var_dump($val);  
    // 替换已写入的对象数据值  
    $mc->replace($key, array("some"=>"haha", "array"=>"xxx"));  
    $val = $mc->get($key);  
    echo "n".str_pad("$mc->replace() ", 60, "_")."n";  
    var_dump($val);  
    // 删除 memcached 中的对象  
    $mc->delete($key);  
    $val = $mc->get($key);  
    echo "n".str_pad("$mc->delete() ", 60, "_")."n";  
    var_dump($val);  
    ?>   

    是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
    $key = md5($sql); //memcached 对象标识符  
    {  
      // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。  
      echo "n".str_pad("Read datas from MySQL.", 60, "_")."n";  
      $conn = mysql_connect("localhost", "test", "test");  
      mysql_select_db("test");  
      $result = mysql_query($sql);  
      while ($row = mysql_fetch_object($result))  
      $datas[] = $row;  
      // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。  
      $mc->add($key, $datas);  
    {  
      echo "n".str_pad("Read datas from memcached.", 60, "_")."n";  
    }  
    var_dump($datas);  
    ?>   

    可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
    之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:
    用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;  
    当前的 PHP 运行结束(或使用了 session_write_close())时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;  
    那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。

    展开全文
  • 缓存之memcached 面试题

    万次阅读 2020-10-11 12:44:17
    文章目录1、memcached是怎么工作的?2、memcached最大的优势是什么?3、memcached和MySQL的querycache相比有什么优缺点?4、memcached和服务器的localcache(比如PHP的APC、mmap文件等)相比,有什么优缺点?5、...
  • memcached For windows

    热门讨论 2013-08-28 14:52:01
    memcached
  • Memcachedmemcached基本控制台操作

    千次阅读 热门讨论 2016-12-12 22:03:37
    Memcached
  • Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
  • memcached—Java操作Memcached

    千次阅读 2014-12-13 20:04:47
    memcached—Java操作Memcached
  • Memcached之——Windows下安装Memcached

    万次阅读 多人点赞 2017-03-11 15:01:20
    一、下载并安装memcached服务器端软件 1、下载服务端memcached软件 32bit:下载 memcached-win32-1.4.4-14.zip(直接下)里面包含6个文件,将解压后的文件夹随便放在什么位置(例如:D:\memcached)。 memcached-...
  • Memcached客户端MemcachedClient使用

    千次阅读 2018-06-08 20:49:45
    一、安装我是在window下安装的memcached,选择的是1.4.4版本,安装起来简单点,安装教程链接。二、MemcachedClient客户端API使用使用MemcachedClient连接memcached,默认端口为11211....
  • Memcached介绍及php-memcache扩展安装

    万次阅读 2020-09-13 20:55:57
    目录Memcached和php-memcache的区别windows环境下安装MemcachedMemcached相关命令windows环境下安装php-memcache扩展 Memcached和php-memcache的区别 ①Memcached技术,是内存缓存。 ②PHP-memcache(或者称为...
  • Memcached与Redis有什么区别

    万次阅读 2020-07-24 11:18:52
    Redis 和 Memcached 都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务,其本质上就是一个内存key-value数据库。Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,628
精华内容 19,851
热门标签
关键字:

memcached