LAMP+Redis缓存

11 篇文章 0 订阅

LAMP+Redis (对于MySQL缓存)实战

          LAMP在企业生产环境中,除了将MySQL单独部署在其他服务器上,由于MySQL数据库压力会很大,还会对MySQL实现主从复制以及读写分离,同时会PHP网站进行调优,通常PHP的优化手段包括:PHP代码本身优化,PHP配置文件优化、为PHP添加缓存模块,将PHP网站数据存入缓存等;

1、Redis入门简介

          Redis是一个开源的使用ANSI  C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是一个key-value存储系统。
和Memcached缓存类似,Redis支持存储的 value类型相对更多,包括 string(字符串)、list(链表) -- 用于MQ(消息队列)、set(集合)、zset(有序集合)和hash(哈希类型)。
Redis是一种高级key-value数据库,它跟memcached类似,不过Redis的数据可以持久化,而且支持的数据类型很丰富,有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。Redis也被看成是一个数据结构服务器。
Redis很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。 Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,方便易用,得到IT人的青睐。
Redis支持 主从同步(Slaveof|replicaof),数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制,由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录,同步对读取操作的可扩展性和数据冗余很有帮助。
目前使用Redis的互联网企业有: 京东、百度、腾讯、阿里巴巴、新浪(memcacheDB)、图吧、研修网等等,如表12-1所示,为目前主流数据库简单功能对比:
 
名称
数据库类型
数据存储选项
操作类型
备注
Redis
内存存储,Nosql数据库
支持字符串、列表、集合、散列表、有序集合
增、删、修改、更新
支持分布式集群、主从同步及高可用、单线程
Memcached
内存缓存数据库,键值对
键值之间的映射
增、删、修改、更新
支持多线程
MySQL
典型关系数据库,RDBMS
数据库由多表主成,每张表包含多行
增、删、修改、更新
支持ACID性质
PostgreSQL
BAT - 银行(Oracle - PG)
典型关系数据库,RDBMS
数据库由多表主成,每张表包含多行
增、删、修改、更新
支持ACID性质
MongoDB
硬盘存储,Nosql数据库
数据库包含多个表
增、删、修改、更新
主从复制,分片,副本集、空间索引
 
 

LAMP+Redis工作机制

LAMP+Redis工作机制:用户通过浏览器访问LAMP网站,并以用户名和密码登录到网站,默认Redis缓存中没有该用户名和密码对应列表,PHP程序会读取 MYSQL数据库中的用户名和密码然后将用户名和密码缓存至Redis中,下次用户通过浏览器再次使用同样的用户名和密码登录网站,PHP无需从数据库中读取该用户和密码信息,而是直接优先从Redis缓存中读取并返回,从而减轻MYSQL数据库的压力。
Redis除了可以缓存用户名、密码,还可以换成PHP论坛各种数据,例如用户帖子、用户动态等等,
要实现将LAMP PHP网站相关数据存入Redis,需要 一台Redis服务器PHP-redis连接驱动、PHP代码连接修改(参数 类似Apache的Include)等。

 

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 

解压出来有三个文件,我们使用upload;

 

重启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数据库中就会重新又出现;可以自行查看。

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值