深入了解memcached缓存数据库

目录

1.什么是缓存

2.buffer和cache

2.1buffer

2.2 cache

2.3 buffer和cache的特点

2.4 linux如何查看内存的缓存

2.4.1 cat /proc/meminfo

2.4.2 free

2.4.3 top

3.1 memcache和memcached

3.2 为什么使用memcached

3.2.1 对数据库的高并发读写

3.2.2 对海量数据的处理

4. memcached的主要原理及其架构

5. memcached安装

6. memcached的特性

6.1 memcached 的set 命令

6.2 memcached 的get命令

7. 应用示例配置

7.1 应用示例配置

 7.2 基础环境配置

7.3 web服务器配置

7.4 mysql数据库服务器配置

7.5 web服务器测试

7.6 mysql服务器测试

7.6 memcached 服务器配置及测试

7.7 在数据库节点**(192.168.150.16)上创建测试数据库**

7.8 在web服务器上配置一下文件


1.什么是缓存

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。

从性能分析: CPU缓存>内存>磁盘>数据库

从性能看:内存是介于CPU和磁盘,在实际中内存是CPU和磁盘的桥梁。buffercache是内存的不同的体现。

2.buffer和cache

2.1buffer

buffer就是写入磁盘,buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的,解决速度慢和快的交接问题。速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。

2.2 cache

cache就是从磁盘读取数据然后存起来方便以后使用cache实现数据的重复使用,速度慢的设备

过缓存将经常要用到的数据缓存起来 ,缓存下来的数据可以提供高速的传输速度给速度快的设备。
例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源,速度会快很
多。

2.3 buffer和cache的特点

共性: 都属于内存,数据都是临时的,一旦关机数据都会丢失。
差异:
  • buffer是要写入数据;cache是已读取数据。
  • buffer数据丢失会影响数据完整性,源数据不受影响;cache数据丢失不会影响数据完整性,但会影响性能

2.4 linux如何查看内存的缓存

2.4.1 cat /proc/meminfo

查看动态更新的虚拟文件。内容比较全面,可以查看到许多关于内存的信息。
例如:
[root@mysql ~]# cat /proc/meminfo
MemTotal:        2027868 kB
MemFree:         1314988 kB
MemAvailable:    1354984 kB
Buffers:            2108 kB
Cached:           170820 kB

2.4.2 free

快速查看内存的方法,也是经常使用的命令。 -h 更人性化的显示内存的单位 -m M 的形式显示。
[root@mysql ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        510M        1.3G        9.5M        185M        1.3G
Swap:          2.0G          0B        2.0G

2.4.3 top

top 命令提供了实时的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。
[root@mysql ~]# top
top - 08:34:43 up 2 min,  1 user,  load average: 0.03, 0.05, 0.03
Tasks:  97 total,   2 running,  95 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027868 total,  1314316 free,   523144 used,   190408 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1354696 avail Mem

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

3.1 memcache和memcached

Memcache 是这个项目的名称,而Memcached 是它服务器端的主程序文件名。一个是项目名称,另一个是主程序文件名。
Memcached是一种缓存技术,将数据放入内存,从而通过内存访问提速,因为内存是最快的。
Memcached的主要目的是提速。
memcached中维护了一张大的hashtable表,该表在内存中,表的结构是key和value,memcachedkey一般是字符串,不能重复。
memcachedvalue可以放入(字符串,数值,数组,对象,布尔,二进制数据,图片和视频)

3.2 为什么使用memcached

由于网站的高并发读写和对海量数据的处理需求,传统的关系型数据库开始出现瓶颈。

3.2.1 对数据库的高并发读写

关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析 SQL 语句、事务处理等)。如果对关系型数据库进行高并发读写(每秒上万次的访问),数据库系统是无法承受的。

3.2.2 对海量数据的处理

对于大型的 SNS(Social Network Service) 网站(如 Twitter、新浪微博),每天有上千万条的数据产生。对关系型数据库而言,如果在一个有上亿条数据的数据表中查找某条记录,效率将非常低。

4. memcached的主要原理及其架构

Memcached 的主要目的是通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数以提高动态 Web 应用的速度,增强网站架构的并发能力和可扩展性。
通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对关系型数据库的直接高并发访问,从而达到提升大规模网站集群中动态服务的并发访问能力。
Web 服务器读取数据时先读 Memcached 服务器,若 Memcached 没有所需的数据,则向数据库请求数据,然后 Web 再把请求到的数据发送到 Memcached ,如下图所示

5. memcached安装

Linux 系统安装 memcached ,首先要先安装依赖库。
yum install gcc gcc-c++ libevent-devel

 yum install memcached -y

systemctl start memcached

6. memcached的特性

Memcached 作为高速运行的分布式缓存服务器,具有以下特点。
协议简单
Memcached 的服务器客户端通信并不使用复杂的 .xml 等格式,而是使用简单的基于文本行的协议
Memcached 连接
因此,通过 telnet 也能在 Memcached 上保存数据、取得数据。以下为示例代码 :
[root@slave ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set foo 0 0 3
bar
STORED
get foo
VALUE foo 0 3
bar
END

6.1 memcached 的set 命令

Memcached set 命令用于将 value( 数据值 ) 存储在指定的 key( 键) 中。
如果 set key 已经存在,该命令可以更新该 key 所对应的原来的数据,也就是实现更新的作用。
 基本语法:
set key flags exptime bytes [noreply]
value
参数说明如下:
key: 键值 key-value 结构中的 key ,用于查找缓存值。
flages: 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
exptime: 在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
bytes: 在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value: 存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value

6.2 memcached 的get命令

Memcached get 命令获取存储在 key() 中的 value(数据值) ,如果 key 不存在,则返回空。

基本语法:

get key

多个 key 使用空格隔开,如下  
get key1 key2 key3 ....
参数说明如下:
key: 键值 key-value 结构中的 key ,用于查找缓存值。

7. 应用示例配置

7.1 应用示例配置

 7.2 基础环境配置

关闭防火墙

systemctl stop 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
环境规划
ip地址环境
192.168.150.16mysql
192.168.150.17web
192.168.150.18memcached

7.3 web服务器配置

在web服务器192.168.150.17上安装软件,启动服务

卸载系统默认的mysql版本

rpm -e mariadb-libs postfix

安装数据库软件

安装ln\amp环境

yum install httpd php php-gb php-mysql php-memcache -y
启动 apache 服务
systemctl restart httpd
systemctl enable httpd

7.4 mysql数据库服务器配置

在mysql服务器192.168.150.16创建用户

create user 'memcache'@'%' identified by 'Mem@1234'

alter user 'memcache'@'%' identified with mysql_native_password by 'Mem@1234'

flush privileges

7.5 web服务器测试

(web 服务器上 ) 测试 http 功能,如下图则正常
测试 PHP 测试功能
[root@web html]# cat index.php
<?php
phpinfo();
?>

在这里可以发现 php 链接是正常的
接下来,我们来测试 mysql:

7.6 mysql服务器测试

链接 mysql 使用 MySQL 服务端的 IP 地址,之前创建好的 memcache 用户名和对相应的密码,若连接正常,返回success ,失败则返回 fail !!
[root@web html]# cat mysql.php
<?php
$link=mysql_connect('192.168.150.16','memcache','Zcf@201104');
if($link)
echo "<h1>Success!!<h1>";
else
echo "Fail!!";
mysql_close();
?>

通过测试,可见MySQL数据库是可以正常链接的。

7.6 memcached 服务器配置及测试

修改客户端监听所有地址
[root@slave 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
Web 服务器( 192.168.42.30)做代码测试
这里的 IP 地址为 memcached 端,和它的端口号
[root@web html]# cat memcache.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.150.18', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>";
$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)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>";
var_dump($get_result);
?>
出现如下则代表 memcache 连接成功:

 配置sessionweb192.168.42.30):

vim /etc/php.ini:
// 把这段放在最下面即可, IP 地址为 web 端地址
session.save_handler = memcache
session.save_path ="tcp://192.168.42.29:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"

7.7 在数据库节点**(192.168.150.16)上创建测试数据库**

create database testab;
use testab;
create table test(id int not null auto_increment,name varchar(20) default null,primary key(id))engine=innodb auto_increment=1 default charset=utf8;
insert into test(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');

 


mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | tom1 |
|  2 | tom2 |
|  3 | tom3 |
|  4 | tom4 |
|  5 | tom5 |
+----+------+
5 rows in set (0.00 sec)
memcache 用户赋予库 testab 的查看权限
grant select on testab.* to memcache@'%' ;

 查看结果如下

mysql> show grants for memcache@'%';
+----------------------------------------------+
| Grants for memcache@%                        |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `memcache`@`%`         |
| GRANT SELECT ON `testab`.* TO `memcache`@`%` |
+----------------------------------------------+
2 rows in set (0.00 sec)

7.8 在web服务器上配置一下文件

[root@web html]# cat memcache1.php
<?php
$memcachehost = '192.168.150.18';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
 $conn=mysql_connect("192.168.150.16","memcache","Zcf@201104");
 mysql_select_db(testab);
 $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/>";
}
?>
如果出现 mysql 表示 memcached 中没有内容,需要 memcached 从数据库中取得 :
再刷新页面,如果有 memcache 标志表示这次的数据是从 memcached 中取得的。
注意: memcached 有个缓存时间默认是 1 分钟,过了一分钟后, memcached 需要重新从数据库中取得数据.

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值