MemCache详细解读

本节内容主要关于mencache的工作原理,memcache的应用场景及其应用实例配置,memcache安装部署。

 一、Memcached工作原理

1.服务端缓存实现

(1)memcached特性

MemCache详细解读_第1张图片

分布式: 实例和缓存在逻辑上是分离的

  普通缓存 Memcached缓存

缓存与特定的应用实例绑定,每个应用实例只能访问特定的缓存 实例独立于各个应用服务器实例运行,每应用实例可以访问任意缓存

整个应用所能访问的缓存容量变小;缓存中存在数据冗余;缓存系统整体效率降低。 整个应用所能访问的缓存容量变大;缓存中无数据冗余;缓存系统整体效率较高。

(2)缓存服务器结构的组织

MemCache详细解读_第2张图片

(3)数据的存取过程

数据的存储与获取: 键值的哈希运算获得一个哈希值,通过配置文件的设置将键值对应的数据保存到相应服务器上;

                         通过键值的哈希运算值去找相应服务器获取数据。

(4)记录的组成及内容特性

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

2.内存管理机制

(1) 为了解决数据频繁读写而导致的内存碎片化问题,引入了slab的概念。

(2) 存储过程,通过数据的大小来找slab,对应的slab类型中有空闲块则存储,没有创建一个新的slab。

MemCache详细解读_第3张图片

(3) 这样的存储方式弊端是浪费资源,因此需要根据实际业务优化,设定初始数据的块大小和递增倍数。

(4) 内存的清理机制,"延迟过期",在没有内存空间的情况下存储数据,

检查有没有过期数据,有覆盖过期数据,没有启动LRU算法,清理最近一次调运时间最长的数据。

(5) 高可用的实现----》一致性hash

二、memcache安装部署

1.安装libevent(依赖)

wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz

tar zxvf libevent-1.4.14b-stable.tar.gz
yum install make gcc gcc-c++
cd libevent-1.4.14b-stable
./configure --prefix=/usr/local/libevent/
make
make install

2.安装memcache

wget https://memcached.org/files/memcached-1.5.16.tar.gz

tar -zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make
make install

启动:

[root@localhost init.d]# /usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p   11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
[root@localhost init.d]# ps -ef |grep memcached

root   16227   1 0 00:56 ?    00:00:00
/usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p 11211 -u root -m 64 -c
1024 -P /var/run/memcached.pid
root   16238  1201 0 00:57 pts/0  00:00:00 grep --color=auto memcached

链接测试:

[root@localhost init.d]# telnet 127.0.0.1 11211

查看当前memcache的状态:stats

退出:quit

安装MySQL:https://blog.csdn.net/xiangmomo1/article/details/107307192    

三、memcached应用场景及应用实例配置

1.场景:Web缓存 数据库缓存

在使用 memcached做法:

MemCache详细解读_第4张图片

(当MySQL数据变化后,memcache缓存机制也会出发,在缓存一份新的数据;第一次访问,访问数据库,访问数据库时缓存机制会缓存一份数据,下次直接缓存memcache,当memcache的数据过期后,继续缓存MySQL。)

2.应用实例配置

MemCache详细解读_第5张图片

环境规划:

192.168.253.150 : memcache

192.168.253.149: web

192.168.253.135 : mysql

同步时间:

yum -y install ntp ntpdate

 ntpdate cn.pool.ntp.org

hwclock --systohc

关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

在web服务器上配置:

rpm -e mariadb-libs postfix             #卸载自带的数据库mariadb
wget https://downloads.mysql.com/archives/get/file/mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm  #下载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              #注意这是一条命令
yum install httpd php php-gd php-mysql php-memcache
systemctl restart httpd
systemctl enable httpd

在mysql服务端创建用户:

mysql> create user 'memcache'@'%' identified by 'Axiang@123';
mysql> alter user 'memcache'@'%' IDENTIFIED WITH mysql_native_password BY
'Axiang@123';
mysql> flush privileges;

(web上)测试

1.测试http功能:

[root@localhost ~]# vim /var/www/html/index.html
[root@localhost ~]# cat /var/www/html/index.html
this is a test form 149..

MemCache详细解读_第6张图片

2.测试PHP链接功能

vim /var/www/html/index.php

cat /var/www/html/index.php
phpinfo();
?>

MemCache详细解读_第7张图片

3.测试mysql(web机器上)

vim /var/www/html/mysql.php

$link=mysql_connect('192.168.253.135','superadmin','Axiang@123');
if($link) echo "

Success!!

";
else echo "Fail!!";
mysql_close();
?>

MemCache详细解读_第8张图片

功能测试:

1.测试web和memcache的连通性:

未改连通性之前:在web服务器上 telnet 192.168.253.150:11211   连接不上

修改客户端监听所有地址(在memcache执行下面这一条命令)   ——》在web服务器上就可以连接上

[root@localhost ~]# /usr/local/memcached/bin/memcached -d -l 0.0.0.0 -p 11211 -u

root -m 64 -c 1024 -P /var/run/memcached.pid

在web服务器上测试

代码测试

vim /var/www/html/mencaceh.php

$memcache = new Memcache;
$memcache->connect('192.168.253.150', 11211) or die ("Could not connect");
$version = $memcache->getVersion();

echo "Server's version: ".$version."
";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at
the server");
echo "Store data in the cache (data will expire in 10 seconds)
";
$get_result = $memcache->get('key');
echo "Data from the cache:
";
var_dump($get_result);
?>

MemCache详细解读_第9张图片

配置session(web服务器)

vim /etc/php.ini

session.save_handler = memcache
session.save_path = "tcp://192.168.42.145:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"

测试memcache的可用性(web服务器)

 vim /var/www/htmlmemcached1.php

session_start();
if (!isset($_SESSION['session_time']))
{
$_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."
";
echo "now_time:".time()."
";
echo "session_id:".session_id()."
";
?>

MemCache详细解读_第10张图片

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

create database testab1;
use testab1;
create table test1(id int not null auto_increment,name varchar(20) default
null,primary key(id)) engine=innodb auto_increment=1 default charset=utf8;
insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
select * from test1;
mysql> grant select on testab1.* to memcache@'%';
Query OK, 0 rows affected (0.00 sec)

测试memcache是否缓存数据库成功

vim /var/www/html/memcached2.php

$memcachehost = '192.168.253.150;
$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.253.135","memcache","Axiang@123");
mysql_select_db(testab1);
$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 "
";
echo "$key";
echo "
";
//print_r($data);
foreach($data as $a)
{
echo "number is $a[id]";
echo "
";
echo "name is $a[name]";
echo "
";
}
?>

如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得:(第一次在数据库上找数据,第二次在memcache,默认memcache的缓存时间为一分钟。一分钟后又在MySQL中找数据。)

MemCache详细解读_第11张图片

刷新页面,如果有memcache标志表示这次的数据是从memcached中取得的。

MemCache详细解读_第12张图片

你可能感兴趣的:(缓存)