目录
一.memcached简介
memcached简介
memcached的特点
二.memcached安装
2.1.yum安装
2.2.源码安装
三.memcached命令
3.1.memcached的特征
3.2.memcached的set命令
3.3.memcached的get命令
四.memcached应用实例配置
4.1.图示
4.2.基础配置
4.3.环境规划
4.3.1.web服务器的配置
4.3.2.mysql 服务器配置
4.3.3.Web服务器上的测试
4.4.实际测试
4.4.1.测试web和memcache的联通性。
4.4.2.在数据库节点上的操作(192.168.75.141)
1.什么是缓存?
缓存是可以进行高速的数据交换的存储器。众所周知,离CPU越近的存储器,效率越高。因此,数据交换效率为: 寄存器>缓存>主存(普通内存)>磁盘。
2.buffer和cache的区别
2.1.buffer
buffer即写入到磁盘。目的是提高内存和硬盘之间数据交换的速度。buffer将数据缓冲下 来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。
2.2.cache
cache就是从磁盘读取数据然后存起来方便以后使用。cache实现数据的重复使用,速度慢的设备需要通 过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。
2.3.buffer和cache的特点
共同点:都属于内存,数据都是临时的,一旦关机数据都会丢失。
差异:① buffer是写入数据,cache是读取数据。
② buffer数据丢失不影响源数据,会赢下你个数据完整性。cache不影响数据完整性,影响性能。
③一般来说cache越大,性能越好,超过一定程度,导致命中率太低之后才会越大性能越低。buffer来 说,空间越大性能影响不大,够用就行。cache过小,或者没有cache,不影响程序逻辑(高并发cache 过小或者丢失导致系统忙死除外)。buffer过小有时候会影响程序逻辑,如导致网络丢包。
④cache可以做到应用透明,编写应用的可以不用管是否有cache,可以在应用做好之后再上cache。当 然开发者显式使用cache也行。buffer需要编写应用的人设计,是程序的一部分。
一.memcached简介
memcached简介
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。 Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可 以用任何语言来编写,并通过memcached协议与守护进程通信。
memcache和memcached的区别:
其实 Memcache 是这个项目的名称,而 Memcached 是它服务器端的主程序文件名。一个是项目名 称,另一个是主程序文件名。
memcached的特点
•协议简单
使用基于文本行的协议,能直接通过telnet在Memcached服务器上存取数据,实现比较简单
•基于libevent的事件处理
libevent是基于C开发的程序库,Memcached利用这个库进行异步事件处理
•内置内存存储方式
Memcached有一套自己的管理内存方式,而且非常高效,所有数据都保存在Memcached内置的内存 中,当存入的数据占满空间时,会使用LRU算法来清除不使用的缓存数据,从而来重用过期数据的内存 空间,但重启服务器数据将丢失
•memcached不互相通信的分布式
各个Memcached服务器之间互不通信,都是独立存取数据,通过客户端的设计让其具有分存式特点, 支持大量缓存和大规模应
二.memcached安装
2.1.yum安装
yum安装需要先安装依赖库才能安装成功
yum install gcc-c++ libevent-devel
yum install memcached -y
2.2.源码安装
源码安装需要从官网下载memcached的压缩包,官网地址为:http://memcached.org/
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure
make && make test
三.memcached命令
3.1.memcached的特征
Memcached 作为高速运行的分布式缓存服务器,具有以下特点。
协议简单: Memcached 的服务器客户端通信并不使用复杂的.xml等格式,而是使用简单的基于文本行的协议。
Memcached 连接:因此,通过 telnet 也能在 Memcached 上保存数据、取得数据。
$ telnet localhost 11211 Trying 127.0.0.1
Connected to localhost.localdomain(127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
3.2.memcached的set命令
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键)中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
•key:键值 key-value 结构中的 key,用于查找缓存值。
•flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
•exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
•bytes:在缓存中存储的字节数
•noreply(可选): 该参数告知服务器不需要返回数据
•value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
3.3.memcached的get命令
Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
get 命令的基本语法格式如下:
get key
多个 key 使用空格隔开,如下:
get key1 key2 key3
参数说明如下:
•key:键值 key-value 结构中的 key,用于查找缓存值。
四.memcached应用实例配置
4.1.图示
4.2.基础配置
检查是否关闭防火墙,并且同步时间
systemctl status firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc
4.3.环境规划
IP地址 | 环境 |
192.18.75.134 | memcache |
192.168.75.140 | web |
192.168.75.141 | mysql |
4.3.1.web服务器的配置
卸载系统默认的mysql版本,安装新的MySQL版本。我的三台机子是克隆之前的虚拟机,所以不需要安装。
安装lnmp环境
yum install httpd php php-gb php-mysql php-memcache
启动apache服务
systemctl restart httpd
sysstemctl enable httpd
4.3.2.mysql 服务器配置
在MySQL端创建用户。
mysql8.0中默认的身份认证插件是caching_sha2_password,替代了之前的 mysql_navtive_password,并且设置用户的host范围为%,使所有主机都可以连接。
create user "memcache"@"%" identified by "Nebula@123";
alter user"memcache"@"%" identified with mysql _native_password by "Nebula@123";
flush privileges;
可以通过命令检查刚才的用户创建是否正确。
select user,host,plugin from mysql.user;
4.3.3.Web服务器上的测试
①测试web服务器上的http功能是否正常
vim /var/www/html/index.php
[root@tuxing html]# cat index.php
<?php
phpinfo();
?>
可以发现php连接是正确的
②测试MySQL连接是否正常
链接mysql使用MySQL服务端的IP地址,之前创建好的memcache用户名和对相应的密码,若连接正常,返回success,失败则返回fail!
cd /var/www/html/
[root@tuxing html]# cat mysql.php
<?php
$link=mysql_connect('192.168.75.141','memcache','Nebula@123');
if($link)
echo "success!!";
else
echo "fail!!";
mysql_close();
?>
测试发现,MySQL连接是正常的。
常见错误排查:
1.检查是否关闭防火墙
2.查看是否没有启动相关服务
3.检查错误日志
4.4.实际测试
[root@slave bin]# /usr/local/memcached/bin/memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
[root@slave bin]# ps -ef | grep memcache
memcach+ 1193 1 0 08:55 ? 00:00:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 1564 1504 0 10:11 pts/1 00:00:00 grep --color=auto memcache
4.4.1.测试web和memcache的联通性。
在web服务器上(192.168.75.140)上做测试:
[root@tuxing html]# cat memcached.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.75.134', 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);
?>
出现上图的显示,则说明连接成功。
配置session,web端:
vim /etc/php.ini
将以下代码放在文件末尾,ip地址修改为自己的web端地址
session.save_handler = memcache
session.save_path ="tcp://192.168.75.134:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"
测试memcached的可用性
[root@tuxing html]# cat /var/www/html/memcache1.php
<?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()."
";
?>
出现上图的显示,则说明测试成功。
4.4.2.在数据库节点上的操作(192.168.75.141)
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');
对memcache用户赋予testab1的查看权限。
grant select on testab1.* to memcache@'%';
查看结果如下:
[root@tuxing html]# cat /var/www/html/memcache2.php
<?php
$memcachehost='192.168.75.134';
$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))
{
$soon=mysql_connect("192.168.75.141","memcache","Nebula@123");
mysql_select_db(testab1);
mysql_query("SET NAMES 'UTF8'");
mysql_query("SET CHARACTER SET UTF8");
mysql_query("SET CHARACTER_SET_RESULTS=UTF8");
$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/>";
//print_r($data);
foreach($data as $a)
{
echo "number is $a[id]";
echo "<br/>";
echo "name is $a[name]";
echo "<br/>";
}
?>
之后刷新一下,可以看到变化。