分布式缓存系统——memcache
一、简介
memcache是一个自由开源的、高性能的、分布式内存对象缓存系统。它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用等。本质上,他就是一个简单的key-value存储系统。
一般的使用目的是:通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度、提高可扩展性。
第一次访问数据库:先从数据库中取得数据返回给浏览器,同时将数据存储在缓存中。
第二次访问相同数据:直接从memcache中取得数据。
(1)memcached的原理
1、服务端缓存实现
①、memcache的特点
memcache使用了BSD许可的服务端缓存实现。与其他服务端缓存实现不同,其主要由两部分组成:独立运行的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的类型进行划分。
使用这种方式分配内存的好处:
(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算法才被执行;从而找到最久没有被使用的需要被替换的数据。
注:这里的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)配置
基础配置图:
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.......
测试php功能
[root@web html]# cat index.php
<?php
phpinfo();
?>
php功能
php连接memcache
php连接数据库
由上可得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();
?>
由上可知,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);
?>
结果
连接成功,测试通过
配置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/>";
?>
结果
测试结果。
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]#
结果
注: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
登录之后的页面
连接之后的页面(监控参数)
2、memcache的监控方法
分布式缓存系统——memcache的更多相关文章
- Memcached 分布式缓存系统部署与调试
Memcache 分布式缓存系统部署与调试 工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的;目前主要用来缓存数据库的数据;存放在内存的数据通过LRU算法 ...
- 分布式缓存之Memcache
〇.为什么要用分布式缓存 1.软件从单机到分布式 走向分布式第一步就是解决:多台机器共享登录信息的问题. 例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享 ...
- NCache:最新发布的.NET平台分布式缓存系统
NCache:最新发布的.NET平台分布式缓存系统在等待Microsoft完成Velocity这个.NET平台下的分布式内存缓存系统的过程中,现在让我们将目光暂时投向其他已经有所建树的软件开发商.Al ...
- 分布式缓存系统 Memcached 整体架构
分布式缓存系统 Memcached整体架构 Memcached经验分享[架构方向] Memcached 及 Redis 架构分析和比较
- 分布式缓存系统Memcached简介与实践
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- (转)C# 中使用分布式缓存系统Memcached
转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...
- memcached分布式缓存系统
在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活.此时 ...
- 分布式缓存系统Memcached简介与以及在.net下的实践(转)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
随机推荐
- 「THUSCH 2017」大魔法师
Description 大魔法师小 L 制作了 \(n\) 个魔力水晶球,每个水晶球有水.火.土三个属性的能量值.小 L 把这 \(n\) 个水晶球在地上从前向后排成一行,然后开始今天的魔法表演. 我 ...
- [Open Source]基于YOLOv3与Django框架的Web应用-YOLOv3_Detect_Web
YOLOv3_Detect_Web Use Yolov3 detect on Web 使用 YOLOv3(PyTorch 和 Django 实现)的对象检测应用程序. 网页和 REST API由Dja ...
- Vue.js高效前端开发 • 【Ant Design of Vue框架进阶】
全部章节 >>>> 文章目录 一.栅格组件 1.栅格组件介绍 2.栅格组件使用 3.实践练习 二.输入组件 1.输入框组件使用 2.选择器组件使用 3.单选框组件使用 4.实践 ...
- Swoole 中使用通道(Channel)实现协程间通讯(消息队列)
通道 Coroutine\Channel 使用本地内存,不同的进程之间内存是隔离的. 只能在同一进程的不同协程内进行 push 和 pop 操作. Co::set(['hook_flags'=> ...
- C# 设置或验证 PDF中的文本域格式
概述 PDF中的文本域可以通过设置不同格式,用于显示数字.货币.日期.时间.邮政编码.电话号码和社保号等等.Adobe Acrobat提供了许多固定的JavaScripts用来设置和验证文本域的格式, ...
- pytest用例的执行顺序
Pytest执行的顺序 当pytest运行测试函数时,它会查看该测试函数中的参数,然后搜索与这些参数具有相同名称的fixture.一旦pytest找到这些对象,它就会运行这些fixture 影响执行顺 ...
- Selenium_单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)
简单写个单选框和复选框界面 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...
- PowerShell 教程
随笔分类 - 教程 转载自:https://www.cnblogs.com/XiaoCY/category/1065141.html PowerShell 管道符之Where-Object的使用方法 ...
- spring boot pom.xml 提示 ignored 具体解决
1.出现这个情况 2. 进入设置,找到 去掉勾选即可
- 编写程序向HBase添加日志信息
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 承接上一篇文档<日志信息和浏览器信息获取及数据过滤> 上一个文档最好做个本地测试 ...