MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离

Redis—redis结合lnmp架构做mysql的缓存服务器

文章目录

  • 一 、redis结合lnmp架构做mysql的缓存服务器实现读写分离
    • (一)在server1中配置nginx
    • (二)在server2中配置redis
    • (三)在server3上安装mysql
    • (四)建立php和redis,mysql的连接
    • (五)浏览器访问测试

一 、redis结合lnmp架构做mysql的缓存服务器实现读写分离

读写分离:用户读的时候访问redis,用户写的时候访问mysql。

原理:server1做web服务器,通过nginx访问redis(使用server2做redis),如果有则直接访问,如果没有,则使用server3做mysql

实验环境

主机名(ip) 角色
server1 (172.25.1.1) 前端服务器nginx
server2 (172.25.1.2) redis数据缓存
server3(172.25.1.3) mysql数据库

(一)在server1中配置nginx

1、首先将server1中的其他服务都关闭并删除,关闭redis服务及所有的redis-server(如果没有做过可忽略)

  • 注意:如果做过ssl服务,可能在安装php时会有影响,可以用yum remove 移除。
[root@server1 ~]# /etc/init.d/redis_6379 stop
[root@server1 ~]# killall -9 redis-server
	##没有命令killall,
[root@server1 ~]# yum whatprovides /usr/bin/killall  ##查找
[root@server1 ~]# yum install psmisc-22.20-11.el7.x86_64 -y ##安装
  • 补充:如果要删除相关服务的模块,可以使用以下命令:
[root@server1 ~]# rpm -qa | grep mysql
[root@server1 ~]# rpm -e `rpm -qa | grep mysql`
#强行删除
[root@server1 ~]# rpm -e `rpm -qa | grep mysql` --nodeps

2、配置nginx

[root@server1 ~]# ls
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz 
[root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
#在此文件下将debug注释

[root@server1 nginx-1.14.0]# vim auto/cc/gcc 
#下载nginx编译和安装时所需要的依赖性

[root@server1 nginx-1.14.0]# yum install -y gcc pcre-devel zlib-devel -y
#由于此实验只是简单的做一个web服务器,所以不需要添加别的模块,编译时只写安装到的路径即可

[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.14.0]# make && make install 

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第1张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、编辑配置文件/usr/local/nginx/conf/nginx.conf,并启动nginx

cd /usr/local/nginx/
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/	#制作软连接
cd conf/
vim nginx.conf
修改以下内容:
  2 user  nginx nginx;

 43         location / {
 44             root   html;
 45             index  index.php index.html index.htm;
 46         }

 65         location ~ \.php$ {
 66             root           html;
 67             fastcgi_pass   127.0.0.1:9000;
 68             fastcgi_index  index.php;
 69             # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 70             include        fastcgi.conf;
 71         }


useradd -u 900 nginx
nginx	#启动
netstat -antlp

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第2张图片
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第3张图片
4.在server1中配置php
安装后启动:

[root@server1 ~]# cd rhel7/
[root@server1 rhel7]# ls
gearmand-1.1.12-18.el7.x86_64.rpm
libevent-devel-2.0.21-4.el7.x86_64.rpm
libgearman-1.1.12-18.el7.x86_64.rpm
libgearman-devel-1.1.12-18.el7.x86_64.rpm
libzip-0.10.1-8.el7.x86_64.rpm
openssl-1.0.2k-16.el7.x86_64.rpm
openssl-libs-1.0.2k-16.el7.x86_64.rpm
php-cli-5.4.16-46.el7.x86_64.rpm
php-common-5.4.16-46.el7.x86_64.rpm
php-fpm-5.4.16-46.el7.x86_64.rpm
php-mysql-5.4.16-46.el7.x86_64.rpm
php-pdo-5.4.16-46.el7.x86_64.rpm
php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm
php-pecl-redis-2.2.8-1.el7.x86_64.rpm
php-process-5.4.16-46.el7.x86_64.rpm
php-xml-5.4.16-46.el7.x86_64.rpm
[root@server1 rhel7]# yum install -y *
[root@server1 rhel7]# systemctl start php-fpm

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第4张图片

systemctl start php-fpm
netstat -antlp

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第5张图片

(二)在server2中配置redis

之前我们已经配置过redis,这里只需要修改即可

1、编辑配置文件(如果之前做过redis主从复制,则需要将之前在配置文件中的内容删除)

[root@server2 ~]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf  sentinel.conf
[root@server2 redis]# vim 6379.conf 
	70 bind 0.0.0.0 #确认监听端口
	#删除最后一行(1379 slaveof 172.25.254.1 6379
	
[root@server2 redis]# /etc/init.d/redis_6379 restart
[root@server2 redis]# netstat -antlp

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第6张图片
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第7张图片
测试redis:可以正常使用

redis-cli
127.0.0.1:6379> get name
"nigar"
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> get name
(nil)

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第8张图片

(三)在server3上安装mysql

1、安装mariadb:打开数据库并进行安全初始化

rpm -qa | grep mysql	#查看之前是否安装过mysql,如果安装过要卸载
[root@server3 ~]# cd /var/lib/mysql/
[root@server3 mysql]# rm -rf *
##如果有之前的数据库数据,删除

yum install -y mariadb-server	#实验不需要用mysql,安装mariadb即可
systemctl start mariadb
mysql_secure_installation	#安全初始化

2、以超级用户登录mysql后,设置redis用户有所有的权限

mysql -uroot -p123	#登陆数据库
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on test.* to redis@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第9张图片

3.将tset.sql(是一些数据)导入数据库test中

vim test.sql 

use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

mysql -p123 < test.sql	#导入数据

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第10张图片
4、测试是否将test.sql成功导入

[root@server3 ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
MariaDB [(none)]> use test;
MariaDB [test]> show tables;
MariaDB [test]> select * from test;

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第11张图片

(四)建立php和redis,mysql的连接

1.配置测试页面:
在server1中:

cd /usr/local/nginx/html/
vim index.php

<?php
        $redis = new Redis();
        $redis->connect('172.25.254.2',6379) or die ("could net connect redis server");	#此处ip为安装redis的虚拟机ip(server2)
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('172.25.254.3','redis','123');	#此处ip为安装mariadb的虚拟机ip(server3);密码为数据库授权的用户密码
                        mysql_select_db(test);
                        $result = mysql_query($query);
                        //如果没有找到$key,就将该查询sql的结果缓存到redis
                        while ($row = mysql_fetch_assoc($result))
                        {
                                $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                }
                else
                {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                }
        }
 
        echo $myserver;
        echo "
"
; for ($key = 1; $key < 10; $key++) { echo "number is $key"; echo "
"
; echo "name is $data[$key]"; echo "
"
; } ?>

在这里插入图片描述
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第12张图片
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第13张图片

(五)浏览器访问测试

1.在浏览器中输入172.25.2.1,此时显示的数据是从mysql中获取的
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第14张图片
2、再次刷新一下浏览器,发现显示的数据发生了改变,此时的数据是从redis中获取的(因为从测试页中可以看出来,从mysql中或从redis中获取的数据是不一样的),之后无论怎么刷新,此时的数据都是从redis中获取的
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第15张图片
此时在server2上也可以查看到
在这里插入图片描述
此时就需要考虑一个问题:如果此时mysql数据发生变更,redis会同步吗?

3、测试redis是否会随mysql数据更新而更新,在server3上,更新数据:

MariaDB [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> update test set name='westos' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test]> select * from test;

MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第16张图片
在server2上查看:发现数据没有变。
在这里插入图片描述
从浏览器访问:数据没变,说明redis不会随mysql数据更新而更新。
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读写分离_第17张图片
此时,我们就出现了 新的问题:如果在mysql中更新数据,发现redis中仍然会有对应的key,数据不会更新,此时就会出现mysql和redis数据不一致的情况。

redis-cli
127.0.0.1:6379> get 1	#并没有修改为haha
"test1"
127.0.0.1:6379> set 1 westos	#手动修改为westos
OK
127.0.0.1:6379> get 1
"westos"

此时在刚才的测试页面中查看,数据才更新了。

这是一个很大的弊端,我们必须时刻查看数据库的数据是否有更新,再手动在redis上更新,这显然不符合企业要求。那么这个问题该如何解决呢?需要用到gearmand,具体用法在下一篇博文中介绍

你可能感兴趣的:(Redis,数据库,redis,nginx,linux,mysql)