分布式缓存系统——memcache

分布式缓存系统——memcache一、简介memcache是一个自由开源的、高性能的、分布式内存对象缓存系统。它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用等。本质上,他就是一个简单的key-value存储系统。一般的使用目的是:通过缓存数据库查询结果,减少

大家好,欢迎来到IT知识分享网。

一、简介

      memcache是一个自由开源的、高性能的、分布式内存对象缓存系统。它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用等。本质上,他就是一个简单的key-value存储系统。

      一般的使用目的是:通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度、提高可扩展性。

      分布式缓存系统——memcache 

 

    第一次访问数据库:先从数据库中取得数据返回给浏览器,同时将数据存储在缓存中。

    第二次访问相同数据:直接从memcache中取得数据。

(1)memcached的原理

  1、服务端缓存实现

    ①、memcache的特点

     memcache使用了BSD许可的服务端缓存实现。与其他服务端缓存实现不同,其主要由两部分组成:独立运行的memcache服务实例,以及用于访问这些服务实例的客户端。相较于普通服务端缓存实现中各个缓存都运行在服务实例之上的情况,memcache服务实例则是在服务实例之外独立运行的。

分布式缓存系统——memcache分布式缓存系统——memcache 

 

 普通缓存与memcache的对比

  普通缓存 memcache
特性 缓存与特定的应用实例绑定,每个应用实例只能访问特定缓存 实例独立于各个应用服务器实例运行,每个应用实例可以访问任意缓存
特点 整个应用所能访问的缓存容量变小,缓存中存在数据冗余;缓存系统整体效率降低 整个应用所能访问的缓存容量变大;缓存中没有数据冗余;缓存系统整体效率较高。

   ②、缓存服务器结构的组织

    检查当前各个服务器的负载情况:《1》若此时服务器的CPU使用率较高,空余内存较大,则在其上就可以运行memcache实例。

                   《2》若此时服务器的CPU使用率不高,空余内容较少,则在其上可以运行多个memcache实例。

                   《3》若此时所使用的服务器均无过多内存,则需要使用一系列独立的服务器扩容。

   ③、数据存取过程

     一个大型的服务常常由多个memcache实例。而这些缓存实例中所存储的数据都不相同。而这种数据的异构性,我们需要在访问我们需要的信息之前确定哪个实例中存储的数据是我们需要的。

          客户端对缓存信息的访问

该客户端知道服务端缓存系统中所包含的所有memcache服务实例。在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如“name”,以及当前memcache缓存服务的配置来计算相应的哈希值,以确定到底哪个memcache实例存储了客户端需要的信息。在确定了存储相应的数据的memcache实例之后,客户端将从配置中读取该memcache服务实例所在的地址,并向该实例发送数据访问请求,并得到name所对应的值。

   客户端对缓存信息的存入

假设用户希望服务服务端缓存记录数据“Lucille” ,并为其指定键值“name”。那么memcache客户端将首先对用户所复制的键值“name”及当前服务端缓存所记录的可用服务实例个数执行哈希计算,并根据哈希计算结果来决定存储该数据的memcache实例。接下来,客户端需要访问的时候,就可以访问到。

    以上信息可得:每个memcached实例都是独立的,彼此之间没有交互;单个节点上不存在进程间通信;节点之间不存在数据同步以及消息广播;便于节点扩缩容。

          这些记录在服务端缓存中的数据是全局可见的。也就是说,一旦在memcache服务端缓存中成功添加了一条新记录,那么其他使用该缓存服务的应用实例将同样可以访问该记录。

   ④、记录的组成及内容特性

    在memcache中,每个记录都由四部分组成:记录的键、有效期、一系列可选的标记以及表示记录内容的数据。由于记录内容的数据中并不包含任何数据结构,因此memcache中所记录的数据需要是经过序列化之后的表示。

       2、内存管理

    在使用缓存时,我们需要考虑的问题是就是如何对缓存数据的生存期进行管理。这其中包括如何确定一个缓存中的数据过期时间,如何在缓存空间不够时确定去除哪些数据的替换等。

   ①、内存管理模型

           通常情况下,一个内存管理算法所需要考虑的问题就是内存碎片化:在长时间的分配和回收的前提下,被系统所使用的内存将趋向于散落在不连续的空间中。这使得系统很难找到连续内存空间,一方面增大了内存分配失败的概率,另一方面也使得内存分配工作变得复杂,降低运行效率。

           以上的问题,memcache使用了一种叫Slab的结构。在该分配算法中,内存将按照1MB的大小划分为页,而划分的每个页会继续被分割为一系列具有相同大小的内存块。

   ②、数据的存储

     在一条新的记录到来时,memcache会首先检查该记录的大小,并根据记录的大小选择记录所需要存储到的Slab类型;接下来,memcache就会检查自己内部所包含的该类型的Slab,如果这些Slab中有空余的块,那么memcache就会使用该块记录表该条信息。如果没有Slab有合适大小的块,那么memcache就会创建一个新的页,并且该页按照目标Slab的类型进行划分。  

 

 分布式缓存系统——memcache

 

 使用这种方式分配内存的好处:

(1)其可以降低由于记录的多次读写而导致的碎片化。

(2)由于memcache是根据记录的大小选择需要插入到的快类型,因此为而每个记录所分配的块的大小常常大于该记录实际需要的内存大小,进而造成内存的浪费。一般情况下,我们要根据业务需求,通过memcache的配置文件来指定各个块的大小,从而尽可能的减少内存的浪费。

注:由于默认情况下memcache中每页的大小为1MB,因为单个块最大为1MB。除此之外,memcache还限制每个数据所对应的键的长度不能超过250个字节。

   ③、内存调优

    对于内存利用率和记录所在位置有影响的因素是:Slab中的各个块的大小以及块大小的递增倍数。

         问题一:例如,各个Slab中块的大小默认情况下是按照1.25倍的方式递增。在某种Slab中的块的大小为80K,另一个Slab中的块的大小为100K。如果我们需要存入一个81K的数据,那我们只能选择100K的Slab来存储数据。此时就会造成较大的内存浪费。

         解决:在设置块大小的和块大小的递增倍数时,需要根据数据的大小以及各个数据的差异幅度。若数据在通常情况下都比较小,则就将最小块的大小调整得小一些;若数据得大小变动不是很大,则将块大小的递增倍数设置的小一些。

         问题二:memcache在计算到底哪个服务实例记录了具有特定键的数据时并不会考虑用来组成缓存系统中各个服务器的差异性。如果每个服务器上只安装了一个memcache实例,那么每一个memcache实例所拥有的可用内存将存在着数倍的差异。但是由于各个实例被选中的概率基本相同,因此具有较大内存的memcache实例将无法被充分利用。

         解决:我们可以通过在具有较大内存的服务器上部署多个memcache实例。

   ④、内存清理

LRU算法:”最近使用的页面数据会在未来一段时间内仍然被使用,以及很久没有使用的页面有可能在未来很久一段时间内仍然不会被使用“。每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据。它的主要衡量指标是使用的时间,附加指标是使用的次数。

 

由于缓存系统拥有有限的资源,其会在某一时刻被服务所产生的数据填满。如果此时缓存系统再次接收到一个缓存数据的请求,那么他就会根据LRU算法以及数据的过期时间来决定需要从缓存系统中移除的数据。

 memcache所使用的过期算法称为延迟过期:当用户从memcache实例中读取数据的时候,其将首先通过配置中所设置的过期时间来决定该数据是否过期。如果已经过期,那么在下一次写入数据却没有足够空间的时候,memcache会选择该过期数据所在的内存块作为新数据的目标地址;如果写入时没有相应的记录被标记为过期,那么LRU算法才被执行;从而找到最久没有被使用的需要被替换的数据。

分布式缓存系统——memcache

 

 注:这里的LRU是在Slab范围内的,即存入新的数据时,先选择Slab的块大小,选择好之后,选择相应的数据进行释放。就算某个不是它规格的数据已经过期,也不会被释放。

 3、高可用实现原理

    在企业中,所有的架构都需要拥有高可用性和高可用性。大型的服务中,memcache组成的服务端是在服务前端拥有多个memcache服务。而如上表明了memcached所具有独立性的正确性,一旦其中的某一个memcache实例发生了故障,那么我们还可以从数据库及服务端再次计算得到该数据,并将其记录在其他可用的memcache实例上。

    问题:由于memcache实例的个数变化会导致哈希计算的结果发生变化,从而导致所有对数据的请求会导向到不正确的memcache实例,使得由memcache实例集群所提供的缓存服务全部失效,从而导致数据库的压力骤增。

    解决:memcache使用一致性Hash算法。在该算法的帮助下,memcache实例的数量变化将只可能导致其中的一部分键的哈希值发生改变。

    问题:一个服务的服务端缓存仅仅由一个或几个memcache实例组成,其中的一个memcache失效。此时数据库以及服务器实例将接收到大量需要进行复杂计算的请求,并将最终导致服务器和数据库过载。

    解决:在设计服务端缓存时,我们需要采用超出容量的方法来定义这些缓存。例如:服务实际需要5个memcache节点时,设计称为一个包含六个节点的服务端缓存系统,以增加整个系统的容错能力。

    (2)memcache的特点

1、memory。内存存储速度快,对于内存的要求高,但对CPU要求很低,所缓存的内容不能持久化。

2、集中式cache。避开了分布式cache的传播问题,但是需要非单点保证他的可靠性,这需要集群的工作。

3、分布式扩展。将部署在一台服务器上的多个memcache服务端或者部署在多个机器上的memcache服务端组成一个虚拟的服务器。对于调用者来说完全屏蔽。提高了单机器的内存利用率。

4、特殊的内存分配机制。支持最大的存储对象为1M,简单的分配机制可以更容易地回收再分配。

5、cache机制简单。

6、客户端。提供客户端给使用者提供空间去扩展和设计客户端来满足需要。

二、安装部署(以centos7.6为例)

(1)源码安装

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@localhost ~]# yum install gcc libevent-devel -y
[root@localhost ~]# wget http://memcached.org/files/memcached-1.5.22.tar.gz
[root@localhost ~]# tar xf memcached-1.5.22.tar.gz 
[root@localhost ~]# cd memcached-1.5.22
[root@localhost memcached-1.5.22]# mkdir -p /apps/memcached
[root@localhost memcached-1.5.22]# ./configure prefix=/apps/memcached/
[root@localhost memcached-1.5.22]# echo $?
0
[root@localhost memcached-1.5.22]# make && make install
[root@localhost memcached-1.5.22]# echo $?
0
[root@localhost memcached-1.5.22]# tree /apps/memcached/
/apps/memcached/
├── bin
│   └── memcached
├── include
│   └── memcached
│       └── protocol_binary.h
└── share
    └── man
        └── man1
            └── memcached.1

6 directories, 3 files
[root@localhost memcached-1.5.22]# echo 'PATH=/apps/memcached/bin:$PATH' > /etc/profile.d/memcached.sh
[root@localhost memcached-1.5.22]# sh /etc/profile.d/memcached.sh 
[root@localhost memcached-1.5.22]# useradd -r -s /sbin/nologin memcached
[root@localhost memcached-1.5.22]# find / -name memcached -type f
/root/memcached-1.5.22/memcached
/apps/memcached/bin/memcached
[root@localhost memcached-1.5.22]# cp /root/memcached-1.5.22/memcached /usr/bin/


#后台启动
[root@localhost memcached-1.5.22]# memcached -u memcached -m 2048 -c 65536 &
[1] 9248

#前台启动
[root@localhost ~]# memcached -d -l 127.0.0.1 -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached.pid
选项:
-d 启动一个守护进程
-l 监听服务器IP地址,默认为所有网卡
-p 设置memcached的TCP监听的端口,默认为11211
-u 是运行memcache的用户
-m 是分配给memcache使用的内存数量,单位是MB,默认为64MB
-c 是最大运行的并发连接数,默认为1024
-P 是设置保存memcache的pid文件。 [root@localhost
~]# netstat -nltp | grep memcached tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 9404/memcached

(2)yum安装

[root@localhost ~]# yum install memcached -y
[root@localhost ~]# vim /etc/sysconfig/memcached 
[root@localhost ~]# cat /etc/sysconfig/memcached 
PORT="11211"   #监听端口
USER="memcached"   #启动用户
MAXCONN="1024"   #最大连接数
CACHESIZE="1024"   #最大使用内存
OPTIONS=""   #其他选项
[root@localhost ~]# ps -ef | grep memcached
memcach+   7390      1  0 01:17 ?        00:00:00 /usr/bin/memcached -u memcached -p 11211 -m 1024 -c 1024
root       7397   7264  0 01:17 pts/0    00:00:00 grep --color=auto memcached

三、应用场景与配置

(1)应用场景

  1、web缓存

       场景:有一个网站,上面承载着某个公司的官方网站,侧面导航栏上拥有这个公司的各个部门以及联系方式。

       在以上场景中,公司的部门不会经常改变,所以可以放置在缓存中。

        原本的访问:

执行一次或多次sql从数据库中查询全站的联系方式—–》 递归行成页面上要显示的数据—–》进入处理数据—–》显示到页面上。

       使用缓存后的访问:

首次访问:判断memcache中是否由这个联系方式—–》没有——》执行一次或多次sql从数据库中查询全站的联系方式—–》放入到memcached中—–》进入处理数据—–》显示到页面上。 

之后访问:判断memcache中是否由这个联系方式—–》有 ——》从memcached中取出数据—–》进入处理数据—–》显示到页面上。

  数据更新

更新数据库中的联系方式—–》找到memcached中的key值,删除—–》重新插入到memcached

   注:memcached的存储操作是原子性的,所以信息的更新不会让客户及只获得部分数据;他们获得只会是新版本或者老版本。  

  2、数据库缓存

        场景:某个网站有一个图片查看功能,页面加载时需要从数据库中查询信息。

   有x张图片且同时又y人查看,对应在数据库中就有x*y条查询记录,且还要显示图片。当大规模用户访问时,数据库的压力就会很大,此时可以使用memcached,将图片信息缓存到memcached上,这样就可以将数据库的压力分散到各个缓存服务器,可以提高网站整体的访问速度。

(2)配置

基础配置图:

分布式缓存系统——memcache

 

 1、基础环境配置

IP地址 主机名 环境
192.168.10.10 web PHP+httpd
192.168.10.11 mysql mysql8.0
192.168.10.12 memcache memcache

 

#三台机器上都要操作
[root@localhost ~]# yum install ntp ntpdate vim wget tree lsof net-tools -y [root@localhost ~]# ntpdate cn.pool.ntp.org 28 Jan 09:38:53 ntpdate[7752]: step time server 84.16.73.33 offset 2548499.251893 sec [root@localhost ~]# hwclock -w #同步时间 [root@localhost ~]# hostnamectl set-hostname memcached #修改名字 [root@localhost ~]# su -l 上一次登录:三 12月 29 21:34:26 CST 2021从 192.168.10.1pts/0 上 #防火墙 三台机器上都要操作 [root@memcached ~]# systemctl stop firewalld [root@memcached ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@memcached ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config [root@memcached ~]# setenforce 0

 2、web操作

[root@web ~]# rpm -e mariadb-libs postfix
[root@web ~]# wget https://dev.mysql.com/get/archives/mysql-8.0/mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
[root@web ~]# mkdir mysql
[root@web ~]# tar xf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar -C mysql
[root@web ~]# cd mysql
[root@web mysql]# yum localinstall mysql-community-client-8.0.16-2.el7.x86_64.rpm mysql-community-server-8.0.16-2.el7.x86_64.rpm mysql-community-libs-8.0.16-2.el7.x86_64.rpm mysql-community-common-8.0.16-2.el7.x86_64.rpm mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm -y
[root@web ~]# yum install php php-gd php-mysql php-memcache -y
[root@web ~]# systemctl start httpd

 3、mysql操作

#安装mysql
[root@mysql ~]# rpm -e mariadb-libs postfix
[root@mysql ~]# groupadd mysql
[root@mysql ~]# useradd -g mysql mysql
[root@mysql ~]# mkdir mysql
[root@mysql ~]# wget https://dev.mysql.com/get/archives/mysql-8.0/mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
[root@mysql ~]# tar xf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar -C mysql
[root@mysql ~]# yum localinstall mysql-community-client-8.0.16-2.el7.x86_64.rpm mysql-community-server-8.0.16-2.el7.x86_64.rpm mysql-community-libs-8.0.16-2.el7.x86_64.rpm mysql-community-common-8.0.16-2.el7.x86_64.rpm mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm -y
[root@mysql ~]# systemctl start mysql
[root@mysql ~]# cat /var/log/mysqld.log 
2022-01-28T03:12:56.221405Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: s7mydVxtUk.6
[root@mysql ~]# mysql -uroot -ps7mydVxtUk.6
mysql> alter user 'root'@'localhost' identified by 'Csbu@1234';  #修改密码
Query OK, 0 rows affected (0.14 sec)


#设置一个用户,用来远程连接
mysql> create user 'memcache'@'%' identified by 'Csbu@1234';
Query OK, 0 rows affected (0.34 sec)

mysql> alter user 'memcache'@'%' identified with mysql_native_password by 'Csbu@1234';
Query OK, 0 rows affected (0.15 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| memcache         | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.91 sec)

mysql> 
mysql> 
mysql> 
mysql> 
mysql> grant all privileges on *.* to 'memcache'@'%' with grant option;
Query OK, 0 rows affected (1.64 sec)

mysql> flush privileges;
Query OK, 0 rows affected (1.66 sec)

 web上操作 测试http功能

[root@web ~]# vim /var/www/html/index.html
[root@web ~]# cat /var/www/html/index.html 
this is a test from 192.168.10.10.......

分布式缓存系统——memcache

 

测试php功能

[root@web html]# cat index.php 
<?php
phpinfo();
?>  

php功能

分布式缓存系统——memcache

 

php连接memcache

分布式缓存系统——memcache

php连接数据库

 

分布式缓存系统——memcache

 

 

 由上可得php连接正常

接下来,连接测试php与数据库的连接情况

[root@web html]# cat mysql.php 
<?php
$link=mysql_connect('192.168.10.11','memcache','Csbu@1234');
if($link) echo "<h1>success!!!</h1>";
else echo "Fail!!!";
mysql_close();
?>

分布式缓存系统——memcache

 由上可知,mysql数据库可以正常连接。

 4、memcache操作

#下载安装包
[root@memcached ~]# wget https://github.com/downloads/libevent/libevent/libevent-2.1.8-stable.tar.gz
[root@memcached ~]# wget http://memcached.org/files/memcached-1.5.12.tar.gz

#安装
[root@memcached ~]# tar xf libevent-2.1.8-stable.tar.gz 
[root@memcached ~]# yum install make gcc gcc-c++ -y
[root@memcached ~]# cd libevent-2.1.8-stable
[root@memcached libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent/
[root@memcached libevent-2.1.8-stable]# echo $?
0
[root@memcached libevent-2.1.8-stable]# make && make install
[root@memcached libevent-2.1.8-stable]# echo $?
0
[root@memcached ~]# tar xf memcached-1.5.12.tar.gz 
[root@memcached ~]# cd memcached-1.5.12
[root@memcached memcached-1.5.12]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@memcached memcached-1.5.12]# echo $?
0
[root@memcached memcached-1.5.12]# make && make install
[root@memcached memcached-1.5.12]# echo $?
0

#启动memcached
[root@memcached ~]# find / -name memcached
/etc/selinux/targeted/active/modules/100/memcached
/root/memcached-1.5.12/memcached
/usr/local/memcached
/usr/local/memcached/bin/memcached
/usr/local/memcached/include/memcached
[root@memcached ~]# cp /usr/local/memcached/bin/memcached /usr/bin/
[root@memcached ~]# memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -p /var/run/memcached.pid
[root@memcached ~]# ps -ef | grep memcached
root      15878      1  2 15:37 ?        00:00:00 memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -p /var/run/memcached.pid
root      15897   7025  0 15:37 pts/0    00:00:00 grep --color=auto memcached 

web上测试memcache的连接

[root@web html]# vim memcached.php
[root@web html]# 
[root@web html]# cat memcached.php 
<?php
$memcache = new Memcache;
$memcache->connect('192.168.10.12',11211) or die ("Could not connect");  #ip为memcached的服务器地址,11211为memcached的端口
$version = $memcache->getVersion();
echo "Server's version:".$version."<br>";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 12;
$memcache->set('key',$tmp_object,false,10) or die ("Failed to save data a the server");
echo "Store data in the cache (data will expire in 10 seconds)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache;<br/>";
var_dump($get_result);
?> 

结果

分布式缓存系统——memcache

 

 连接成功,测试通过

配置session

[root@web html]# vim /etc/php.ini
session.save_handler = memcache  #设置session的存储方式为memcache。默认以文件方式存取session数据。
#如果想使用自定义待得处理来存取session数据,比如memcache方式则修改为session。save_handler=memcache
session.save_path = "tcp://192.168.10.10:11211?persistent=1&weight=1&timeout=1&retry_interval=15" #设置session存储的位置,多台memcache用逗号隔开。 

测试memcached的可用性:

[root@web html]# vim memcachedcan.php
[root@web html]# cat memcachedcan.php 
<?php
session_start();
if (!isset($_SESSION['session_time']))
{
  $_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."<br/>";
echo "now_time:".time()."<br/>";
echo "session_id:".session_id()."<br/>";
?>

结果

分布式缓存系统——memcache

 

 测试结果。

5、最终测试

在数据库上创建测试数据库

mysql> create database test;
Query OK, 1 row affected (0.96 sec)

mysql> use test;
Database changed
mysql> create table test01(id int not null auto_increment,name varchar(20) default null,primary key(id)) engine=innodb auto_increment=1 default charset=utf8;
Query OK, 0 rows affected, 1 warning (1.74 sec)

mysql> desc test01;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.69 sec)

mysql> insert into test01(name) values ('chu'),('zhang'),('yang'),('xiao'),('chen');
Query OK, 5 rows affected (3.13 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from test01;
+----+-------+
| id | name  |
+----+-------+
|  1 | chu   |
|  2 | zhang |
|  3 | yang  |
|  4 | xiao  |
|  5 | chen  |
+----+-------+
5 rows in set (0.09 sec) 

编写测试脚本

[root@web html]# cat test.php 
<?php
$memcachehost = '192.168.10.12';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
  $conn=mysql_connect("192.168.10.11","memcache","Csbu@1234");
  mysql_select_db(test);
  $result=mysql_query($query);
  while ($row=mysql_fetch_assoc($result))
  {
     $arr[]=$row;
  }
  $f = 'mysql';
  $memcache->add($key,serialize($arr),0,30);
  $data = $arr;
}
else{
  $f = 'memcache';
  $data_mem=$memcache->get($key);
  $data = unserialize($data_mem);
}
echo $f;
echo "<br>";
echo "$key";
echo "<br>"
foreach($data as $a)
{
echo "number is <b><front color=#FF0000>$a[id]</front></b>";
echo "<br>";
echo "name is <b><front color=#FF0000>$a[name]</front><b>";
echo "<br>";
}
?>
[root@web html]#  

结果

分布式缓存系统——memcache分布式缓存系统——memcache

 

 注:memcached有一个缓存时间默认为1分钟,过了一分钟之后,memcached需要重新从数据库中取得数据。

四、管理与监控

1、memcache的管理工具

   memadmin是一款可视化memcache的管理与监控工具,使得PHP开发,体积小,操作简单。

   主要功能:

    服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新。

    服务器性能监控:GET、DELETE、INCR、DESC、CAS等常用操作命中率实时监控。

    支持数据遍历,方便对存储内容进行监视。

    支持条件查询,筛选出满足条件的KEY或VALUE

    数组、JSON等序列化字符反序列显示。

    兼容memcache协议的其他服务。

     支持服务器连接池,多服务器管理切换简洁。

安装方法:

前提:
需要一个已经安装httpd的服务器,且需要安装一个LAMP环境,之前搭建的web服务器即可用

安装:
[root@web ~]# wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
[root@web ~]# tar xf memadmin-1.0.12.tar.gz 
[root@web ~]# mv memadmin/ /var/www/html/
修改登录密码
[root@localhost memadmin]# vim /var/www/html/memadmin/config.php 
$config['user'] = "admin"; // your username
$config['passwd'] = "admin"; // your password 

访问:

http://IP/memadmin/index.php

分布式缓存系统——memcache

 

登录之后的页面

分布式缓存系统——memcache

 

 连接之后的页面(监控参数)

分布式缓存系统——memcache

2、memcache的监控方法

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30906.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信