文章目录
Memcache
Memcache的作用网上资料都讲的很好,说简单点就是减轻读取数据库的压力,原理也很简单:
被请求的数据会先到memcache里去取,如果没有就去数据库里取,顺便给memcache带一份。
每次更新数据也先更新memcache里的数据,如果没有则更新数据库,同时更新memcache。
因此需要注意的是这个数据是易失去性存储的。
一、Memcache概述
Memcache是一套自由、开源、高性能、分布式的高速缓存系统。由于Memcache通过在内存中缓存数据和对象来减少读取数据库的次数。目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。
Memcache是一个存储键值对的HashMap,在内存中对任意的数据都可以使用key-value的方式存储,数据库可以来自数据库调用或API调用。Memcache设计理念就是小而强大,她简单的设计促进了快速部署、易于开发并解决大规模的数据缓存的许多难题,而其所开放的API使得Memcache能用于Java、C/C++/C#、Perl、Python等大部分流行的程序语言。
二、Memcache工作流程
注意Memcache虽然被称为“分布式缓存”,但是Memcache本身完全不具备分布式的功能,Memcache集群之间不会相互通信,所谓的“分布式”,完全依赖于客户端程序来实现,如图:
Memcahe工作流程: (1)应用程序输入需要写入缓存的数据;
(2)API将Key输入路由算法模块,理由算法根据Key和Memcache集群服务器列表得到服务器的编号;
(3)由服务器编号得到Memcache及其IP地址和端口号;
(4)API调用通信模块和指定编号的服务器通信,讲数据写入该服务器,完成一次分布式缓存的写操作;扫描二维码关注公众号,回复: 11837064 查看本文章
不管是读取缓存还是写入缓存,只要使用相同的路由算法和服务器列表、应用程序查询的是相同的key,Memcache客户端总是访问相同的客户端去读取数据,只要服务器缓存中还有该数据的缓存,就能保证缓存命中。
这种Memcache集群的方式也是从分区容错性的方面考虑的,假设Node2宕机了,那么Node2上存储的数据都不可用了,此时由于集群中Node0和Node2还存在,下一次请求获取Node2的缓存数据,肯定是没有命中的。这时首先会从数据库中获取到缓存的数据,通过路由算法根据将缓存的数据存储在Node0或Node1上,这种集群的做法很好,但是缺点是成本太大。
2.1:Mencache基本设置
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
三:搭建Memcache
Memcache 的安装分为两个过程:memcache 服务器端的安装和 memcached 客户端的安装。所谓服务器端的安装就是在服务器(一般都是 linux 系统)上安装 Memcache 实现数据的存储。
所谓客户端的安装就是指 php(或者其他程序,Memcache 还有其他不错的 api 接口提供)去使用服务器端的 Memcache 提供的函数,需要 php 添加扩展。
由此可以看出Memcache的搭建需要借助于LAMP或LNMP,本篇博文采用LAMP结构。
实验环境
一台centos 7作为服务器 20.0.0.41
一台centos 7作为客户端 20.0.0.42
实验目的
- 搭建memcache服务端和客户端,通过访问客户端来确定服务端的连接是否正常
- 工作原理是:
- Memcached有两个核心组件组成:服务器端(server)和客户端(client)。
- 在一个memcached的查询中,client先通过计算key的hash值来确定kv对所处在的server位置。
- 当server确定后,客户端就会发送一个查询请求给对应的server,让它来查找确切的数据。
- 因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的:
3.1:搭建memcache服务器
[root@mencache ~]# ls
anaconda-ks.cfg 公共 文档
initial-setup-ks.cfg 模板 下载
libevent-2.1.8-stable.tar.gz 视频 音乐
memcached-1.5.6.tar.gz 图片 桌面
//解压事件包
[root@mencache ~]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt
//解压源码包
[root@mencache ~]# tar zxvf memcached-1.5.6.tar.gz -C /opt
//查看opt目录
[root@mencache ~]# cd /opt
[root@mencache opt]# ls
libevent-2.1.8-stable memca:ched-1.5.6 rh
3.2:编译安装memcache和事件库
//安装编译器
[root@mencache opt]# yum install gcc gcc-c++ make -y
[root@server libevent-2.1.8-stable]# cd libevent-2.1.8-stable/
[root@server libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent //指定libevent目录
//编译及安装
[root@server libevent-2.1.8-stable]# make && make install
//memcache依赖于libevent
//进入memcache目录
[root@server libevent-2.1.8-stable]# cd ../memcached-1.5.6/
[root@server memcached-1.5.6]# ./configure \
> --prefix=/usr/local/memcached \ '//指定memcache路径
> --with-libevent=/usr/local/libevent '//关联libevent事件库'
[root@server memcached-1.5.6]# make && make install
//建立memcache命令软连接
[root@mencache memcached-1.5.6]# ln -s /usr/local/memcached/bin/* /usr/local/bin/
//-u:守护进程 -m:缓存大小32M -p端口为11211 -u指定用户
[root@mencache memcached-1.5.6]# memcached -d -m 32m -p 11211 -u root
//检查是否开启成功
[root@mencache memcached-1.5.6]# netstat -ntap |grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 33866/memcached
tcp6 0 0 :::11211 :::* LISTEN 33866/memcached
//关闭防火墙
[root@mencache memcached-1.5.6]# systemctl stop firewalld.service
[root@mencache :memcached-1.5.6]# setenforce 0
3.3:memcache测试【数据操作】
//安装telnet软件 否则没有连接
[root@mencache memcached-1.5.6]# yum install telnet -y
//进行链接
[root@mencache memcached-1.5.6]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character i:s '^]'.
3.4:memcache数据库基本操作
//“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
//“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
//“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败
//cas,检查更新,更新因子需要相等,
//append,键值后追加数据
//prepend,键值前追加数据
//delete,删除
//flush_all,清楚所有缓存数据
Escape character is '^]'.
add shuai 0 0 7 //0:不使用序列号 0:用过期 5:指定字节长度
1234567 //上面设置字节长度为6 不为6 就会报错
STORED
get shuai //查看
VALUE username 0 7
123456
gets shuai //查看
VALUE shuai 0 7 2 //更新因子 每次更新+1
1234567
END
set shuai 0 0 8 //更新数据,若键名不存在,则自行添加
12345678
STORED
gets shuai //查看
VALUE shuai 0 8 3 //更新因子已经更新+1
12345678
END
replace niu 0 0 2 //更新的键名与键值要存在 set:以存在的数值进行替换 没有数值直接添加【相当于add添加】
12
NOT_STORED //可以看到添加不上
replace shuai 0 0 9 //更新shuai键值
123456789
STORED
gets shuai //查看
VALUE shuai 0 9 4 //更新因子已经+1 shuai:键值 9:长度 123456789:值
123456789
END
cas shuai 0 0 8 4 //检查更新,更新因子相等则更新返回EXISTS
78945612
STORED
get shuai
VALUE shuai 0 8 //更新因子已经更新到8
78945612
cas shuai 0 0 8 2 //如果不指定更新因子就会出错
78945612
EXISTS
append shuai 0 0 4 //键值后面增加数据
book
STORED
get shuai //可以看到boot已经添加成功
VALUE shuai 0 12
78945612book
END
prepend shuai 0 0 2 //键值前面增加数据
un
STORED
get shuai //添加成功
VALUE shuai 0 14
un78945612book
END
delete shuai //删除shuai
DELETED
quit
Connection closed by foreign host.
四:搭建memcache客户端
- 搭建LAMP
这边我们就不一一例举了可以查看我之前的博客:部署LAMP架构
4.1:搭建memcache客户端
[root@localhost ~]# tar zxvf memcache-2.2.7.tgz -C /opt
//增加为PHP的模块后在对memcache进行配置
[root@localhost memcache-2.2.7]# /usr/local/php5/bin/phpize
Zend Extension Api No: 220131226
[root@localhost memcache-2.2.7]# ./configure \
--enbale-memcache \
--with-php-config=/usr/local/php5/bin/php-config
//
[root@localhost memcache-2.2.7]# ./configure \
--enable-memcache \ //开启memcache
--with-php-config=/usr/local/php5/bin/php-config //关联php配置文件
//编译
[root@localhost memcache-2.2.7]# make && make install
//共享文件
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-zts-20131226/
vim /usr/local/php5/php.ini //搜索并修改下面一行,在新增一行
//搜索extension——dir
; extension_dir = "ext"
//下面添加
extension_dir="/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"
extension=memcache.so //指向memcache模块
....省略信息........
4.2:测试服务端
- 用客户端检测服务端是否正常连接
<?php
$memcache = new Memcache();
$memcache->connect('20.0.0.41',11211); //指定memcache服务器地址
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo$result;
?>
//重启服务
[root@localhost memcache-2.2.7]# service httpd stop
[root@localhost memcache-2.2.7]# service httpd start
4.3:服务端进行测试
本文到此结束,感谢观看