LAMP+Redis缓存

    科技2025-05-22  41

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

     

     

     

     

     

     

     

    Processed: 0.009, SQL: 8