LAMP+Redis (对于MySQL缓存)实战
LAMP在企业生产环境中,除了将MySQL单独部署在其他服务器上,由于MySQL数据库压力会很大,还会对MySQL实现主从复制以及读写分离,同时会PHP网站进行调优,通常PHP的优化手段包括:PHP代码本身优化,PHP配置文件优化、为PHP添加缓存模块,将PHP网站数据存入缓存等;
1、Redis入门简介
名称
|
数据库类型
|
数据存储选项
|
操作类型
|
备注
|
Redis
|
内存存储,Nosql数据库
|
支持字符串、列表、集合、散列表、有序集合
|
增、删、修改、更新
|
支持分布式集群、主从同步及高可用、单线程
|
Memcached
|
内存缓存数据库,键值对
|
键值之间的映射
|
增、删、修改、更新
|
支持多线程
|
MySQL
|
典型关系数据库,RDBMS
|
数据库由多表主成,每张表包含多行
|
增、删、修改、更新
|
支持ACID性质
|
PostgreSQL
BAT - 银行(Oracle - PG)
|
典型关系数据库,RDBMS
|
数据库由多表主成,每张表包含多行
|
增、删、修改、更新
|
支持ACID性质
|
MongoDB
|
硬盘存储,Nosql数据库
|
数据库包含多个表
|
增、删、修改、更新
|
主从复制,分片,副本集、空间索引
|
LAMP+Redis工作机制
2、LAMP+Redis操作案例
LAMP PHP连接Redis,首先需安装Redis服务器,安装连接驱动,然后修改PHP网站配置文件,具体操作步骤如下:
基础实验环境概述:
LAMP服务器:192.168.3.205
Redis主库:192.168.3.201
Redis从库:192.168.3.202
首先,针对于LAMP的源码部署,在本博文中将不进行描述,在之前的博文中有LAMP+Wordpress的源码部署,在这里我直接恢复快照!!
再打开两台都恢复到init状态:
1)、先将之前的wordpress全部删掉,然后自己写页面内容;如下:
编写index.php的测试页面,内容如下:
2)、在三台设备上安装基本的工具以及依赖
[root@Lamp htdocs]# yum install -y lrzsz vim wget gcc gcc-c++
3)、在两台Redis设备上上传Redis源码包,并且编译安装Redis,过程如下:
在Redis从库上同理编译安装Redis:
4)、在redis的安装包中,redis.conf是配置文件模板,需要把他cp到安装路径下,然后进行编辑;
5)、修改redis.conf文件,如下:
修改bind,因为要给别人做缓存要监控所有,所以要修改为0.0.0.0;
6)、启动redis的时候要设置读取redis.conf;
[root@Master redis]# bin/redis-server redis.conf #表示前台运行
如上图:运行之后有很多的WARNING,需要按照里面的内容进行操作,消除WARNING; 如下:
此时再进行启动,就不存在WARNING;
但是目前redis是前台运行,如果是这样的话,占用了一个终端,所以需要进行后台运行,如下:
添加&表示后台运行,此时6379端口依然监听;
同理,在Slave节点上,也进行同样的操作,启动redis。如下:
[root@Slave ~]# cp /usr/local/redis-3.2.5/redis.conf /usr/local/redis/
修改redis.conf,这里由于是slave所以还需要修改slaveof参数,如下:
修改如下:slaveof参数需要修改成Master的地址加端口号
启动Slave上的redis,如下:
[root@Slave ~]# /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
在Master上,为了redis操作方便,将/usr/local/redis/bin/追加到$PATH里面去:
之后,使用下列命令可以看到同步状态:
7)、配置LAMP服务器,目的是为PHP调用redis模块,来进行缓存;
首先,先下载一个开源的软件
wget http://github.com/phpredis/phpredis/archive/3.1.2.tar.gz
如下,解压之后,里面的文件是phpredis-3.1.2:这指的是PHP连接redis的连接器;
进入到phpredis,并且预编译安装,具体过程,如下:
将phpredis预编译安装到php的配置文件中,然后开启redis;在预编译之前需要运行/usr/local/php/bin/phpize,这个是因为要让本地的PHP支持外挂其他软件程序;
[root@Lamp phpredis-3.1.2]# make && make install #预编译之后,进行make安装
安装之后,回头一个共享模块安装的路径,需要记录下来,后面使用PHP调用的时候需要用到;
现在需要修改PHP配置文件,调用刚刚安装的phpredis,如下:
[root@Lamp phpredis-3.1.2]# vim /usr/local/php/php.ini
需要在配置文件中,将刚刚的共享模块路径添加进去;
修改为:
然后在配置文件中的extension调用区域,添加上调用的参数:如下:
此时,重启Apache服务,然后查看页面:
[root@Lamp phpredis-3.1.2]# /etc/init.d/apachectl restart
现在访问PHP的页面,会多出一个redis的部分,这个在做之后,是不存在的;
8)、通过redis进行缓存测试,如下内容;
之前我将快照恢复的LAMP+wordpress,然后将wordpress的内容都删除掉了,现在用来测试可以顺手搭建一个Discuz;
上传Discuz并解压:
[root@Lamp src]# unzip Discuz_X3.2_SC_GBK.zip
重启Apache之后,访问Discuz;刚开始编码看不懂可以使用浏览器中的查看,将其文字编码变成简体中文:
点击我同意之后,进入安装界面:
发现很多的文件权限不可写,这个是因为复制到htdocs的文件属主属组都是root,但是我Apache是使用apache这个用户运行的,所以需要修改htdocs目录下的文件属主属组都是apache这个用户:
此时,刷新页面,状态都是OK的,可以进行下一步:
如下,需要填写数据库的信息,为了方便都设置成了discuz;管理员信息不需要出现在数据库中;
在进行下一步之前需要在服务器上的数据库中添加discuz的库,用户,密码,并且授权;具体过程如下:
数据库创建好之后,进行下一步,然后进入安装,安装结束之后,点击访问:
进入之后,可以看到discuz的页面:
于此同时,在Master上查看redis,keys都是空的,没有键值,没有起到缓存的作用:
要让redis缓存起作用,需要在LAMP中的htdocs里面的discuz文件中找到全局配置文件,进行修改,如果是wordpress也是一样的;如下:
[root@Lamp apache2.4]# vim /usr/local/apache2.4/htdocs/config/config_global.php
需要在标注位置将redis的Master节点的地址添加上去:
修改为:
注释:Prefix表示的是缓存到的数据的前缀,这个可以自定义的,我这里就先保持默认inA50p;
重启Apache,刷新页面,然后查看Master上是否有缓存到的数据:
刷新页面之后,可以看到在Master上有以inA50p为前缀的缓存数据
注释:实际上缓存的这些东西,其实是LAMP中 Mysql中discuz库中的一些表的键值,理论上是通过复制Mysql中的某个库某个值来做缓存的;
现在在discuz论坛上注册一个用户:点击提交
此时,我们注册的信息在discuz库中的pre_common_member中:
使用select查看具体的用户:可以看到我们刚刚注册的zhanggeng用户;
在Master的redis中查看存不存在这个缓存:
最后在inA50p_common_member_2中找到了之前注册用户的信息,可以看出,Redis从mysql中将某些值复制过来,换了个名字;然后起到缓存的作用;缓存是根据数据库来的。
现在将Mysql中discuz库中的zhanggeng用户删除掉,来查看后面的现象:
在Mysql数据库中将用户删除之后,在redis缓存中数据还是存在的:如下图所示:
此时在Discuz的页面上使用zhanggeng用户登录一下,尝试是否还可以登录上去:
通过下面图中的现象看来,还是可以登录上去的,该数据来自于redis的缓存;不再去mysql上读取数据了,直接在redis上读取的数据;
现在将Redis进行关闭:
重新启动:
现在看redis中的缓存都没有了:如下
如果上述重启之后,由于存在Slave或者其他原因导致缓存还是存在的,可以使用下面方法进行清理Redis缓存:
再去Discuz的页面上使用zhanggeng用户登录做尝试:
当点击退出登录的时候,会出现请求拒绝的页面,
重新登录站点使用zhanggeng用户登录
登录之后,显示账号需要激活:
这是由于discuz的愿意,直接就自动注册了,相当于重新注册了:
之后会出现账号需要注册的界面,自动就注册掉了,其实是重新注册的,并没有通过缓存访问到,因为缓存前面已经清除掉了,因为重新注册了,所以在mysql数据库中就会重新又出现;可以自行查看。