精选文章 MemCache详细解读

MemCache详细解读

作者:香香默默 时间: 2020-08-05 08:36:53
香香默默 2020-08-05 08:36:53

本节内容主要关于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) 这样的存储方式弊端是浪费资源,因此需要根据实际业务优化,设定初始数据的块大小和递增倍数。

MemCache详细解读4

(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详细解读5

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

2.应用实例配置

MemCache详细解读6

环境规划:

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详细解读7

2.测试PHP链接功能

vim /var/www/html/index.php

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

MemCache详细解读8

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详细解读9

功能测试:

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详细解读10

配置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详细解读11

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

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详细解读12

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

MemCache详细解读13

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:零基础学习HTML5前端提升攻略!

下一篇:纯干货 | UI界面中按钮设计CTA按钮\订阅按钮

您可能感兴趣

  • RabbitMQ之Exchange、Queue参数详解

    1.先来介绍RabbitMQ中的成员 Producer(生产者): 将消息发送到Exchange Exchange(交换器):将从生产者接收到的消息路由到Queue Queue(队列):存放供消费者消费的消息 BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由到Queue) RoutingKey(路由键):...

  • 【STM32F429开发板用户手册】第38章 STM32F429的FMC总线应用之是32路高速IO扩展

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32429的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值。 目录 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 38.1 初...

  • linux远程传输文件命令:scp

    一、简介 scp命令用户linux之间复制文件和目录。全称secure copy,是基于ssh登录进行安全的远程文件拷贝命令。scp是加密的,rcp是不加密的,scp是rcp的加强版。 二、语法 scp [参数] source target 参数说明: -1: 强制scp命令使用协议ssh1 -2: 强制scp命令使用协议ssh2 -4: 强制scp命令只使用IPv4寻址 -6: 强制scp...

  • 【计算机网络】第七章:网络安全

    【计算机网络】第七章:网络安全 目录 网络安全问题概述 1.1.计算机网络面临的安全性威胁 1.2.被动攻击和主动攻击 1.3.计算机网络通信安全的目标 1.4.恶意程序(rogue program) 1.5.计算机网络安全的内容 1.6.一般的数据加密模型 两类密码体制 一、对称密钥密码体制 1.1.对称密钥的缺点与优点 1.2.数据加密标准 DES 1.3.DES 的保密性 二、公钥密码...

  • Redis到底该怎么搞呢?主从复制以及redis复制演进全面进攻

    一、前言 通过持久化功能,Redis保证了即使在服务器宕机情况下数据的丢失非常少。但是如果这台服务器出现了硬盘故障、系统崩溃等等,不仅仅是数据丢失,很可能对业务造成灾难性打击。为了避免单点故障通常的做法是将数据复制多个副本保存在不同的服务器上,这样即使有其中一台服务器出现故障,其他服务器依然可以继续提供服务。当然Redis提供了多种高可用方案包括:主从复制、哨兵模式的主从复制、以及集群。 本...

  • Web端即时通讯实践干货:如何让WebSocket断网重连更快速?

    本文作者网易智慧企业web前端开发工程师马莹莹。为了提升内容质量,收录时有修订和改动。 1、引言 在一个完善的即时通讯IM应用中,WebSocket是极其关键的一环,它为基于Web的即时通讯应用提供了一种全双工的通信机制。但为了提升IM等实际应用场景下的消息即时性和可靠性,我们需要克服WebSocket及其底层依赖的TCP连接对于复杂网络情况下的不稳定性,即时通讯的开发者们通常都需要为其设计...

  • 工作流学习2(书本)

    1、流程引擎的创建。 1.1、ProcessEngineConfiguration的buildProcessEngine方法 使用ProcessEngineConfiguration的create方法可以得到ProcessEngineConfiguration的实例。ProcessEngineConfiguration中提供了一个buildProcessEngine方法,该方法返回一个Pro...

  • Yolo系列详解

    零、图像基本概念 图像表示为二维的矩阵  灰阶图像 0-255,0表示黑色,255表示白色,其余表示灰色。 图像的坐标轴   彩色图像  注意:颜色信息对于任务有时候有用,有时候没用。 一、什么是目标检测 目标检测是计算机视觉中的经典的原子问题,即通过输入的图像来完成物体的检测,它需要解决两个问题: 物体在哪里 物体是什么 目标检测算法的传统实现 sift hog 等算法。这些算法的...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。