redis配合mysql

mac2024-08-16  60

数据访问流程:

client -> app -> redis -> mysql -> redis -> client 客户端用app访问,先在redis里读数据,因为快,redis没有才去mysql读, 读完保存在redis里,然后返回客户端,下次再读就快

【1】:【server1】

1: #没有killall命令,进行寻找安装 yum whatprovides /usr/bin/killall yum install -y psmisc-22.20-11.el7.x86_64 killall redis-server ##关掉redis进程 /etc/init.d/redis_6379 stop ps aux | grep redis ##查看进程是否完全关闭 关闭之前实验的所有应用,以防影响实验 在server1配置nginx和php访问页面

2:先配置nginx(nginx只是提供了负载均衡,所以版本要求不高) 解压nginx包 tar zxf nginx-1.17.4.tar.gz vim /root/nginx-1.17.4/auto/cc/gcc ##关闭debug 171 # debug 172 #CFLAGS="$CFLAGS -g" 编译nginx(编译过程中缺什么补什么) ./configure --prefix=/usr/local/nginx yum install pcre-devel -y yum install zlib-devel -y 编译成功!!! make && make install

3:配置redis,php页面 自己装的openssl和php的openssl是不一样的 cd /root/redis/rhel7/ --> ls yum install * -y ##首先在server1配置好nginx cd /usr/local/nginx/conf/

vim nginx.conf

2: user nginx nginx; 45 index index.php index.html index.htm; 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 nginx ##添加用户 /usr/local/nginx/sbin/nginx #启动并测试nginx systemctl start php-fpm ##启动php-fpm netstat -antlp ##查看端口,80,9000

【2】:配置server2

【server2】 1: vim /etc/redis/6379.conf 70 bind 0.0.0.0 /etc/init.d/redis_6379 start ##在server2上配置redis为master,因为之前做了主从,关闭server1的redis

#如果有key,删除key,del name [root@server2 ~]# redis-cli 127.0.0.1:6379> get name (nil) 2:配置测试页面

cd /root/redis/ --> ls mv test.php /usr/local/nginx/html/ mv test.php index.php ##将test.php 改为index.php

【3】:配置server3

##再开启server3,关闭原来的mysql

[root@server3 ~]# rpm -qa | grep mysql ##旧版本的虚拟机什么也没有 [root@server3 ~]# rpm -e rpm -qa | grep mysql --nodeps 新版本的有东西,需删除 #清除原来数据目录里的内容 cd /var/lib/mysql rm -fr * (我的环境是新的,所以不需要做以上3步操作)

1:安装mariadb,这里试验用这个就行 yum install -y mariadb-* /var/lib/mysql/ -->ls 什么也没有,环境是干净的 systemctl start mariadb #启动mariadb 2:安全初始化 mysql_secure_installation ##这里密码可以设置为简单的,如redhat,其他回车即可 3:#登录数据库,授权用户 mysql -uroot -predhat MariaDB [(none)]> create database test; MariaDB [(none)]> grant all on test.* to redis@’%’ identifiedby ‘redhat’; MariaDB [(none)]> flush privileges;

【4】【server1】修改nginx的发布文件test.php

vim /usr/local/nginx/html/test.php 3 $redis->connect(‘172.25.78.2’,6379) ##连接redis,即连接server2的6379端口

10 $connect = mysql_connect(‘172.25.78.3’,‘redis’,‘redhat’); ##连接数据库

【5】【server3】为server3上的mysql的test库加入一些数据

1: cd /root/redis – > ls vim test.sql ##只是看一下加入的数据 ##注释掉的目前用不到,是创建查询的触发器的 2:将test.sql的内容导入到数据库中 mysql -predhat < test.sql 【6】测试 1:在浏览器测试:

172.25.78.1

##可以看到导入的数据,但是刷新一次后,可以看到后面就从redis读取数据 可以简单的理解为: 第一次访问到后台访问数据库,访问的东西放到redis里面 第二次访问到redis 2:在【server2】使用命令行也可以测试 [root@server2 ~]# redis-cli 127.0.0.1:6379> get 1 “test1” 127.0.0.1:6379> get 2 “test2”

【7】这个时候有个问题,如果此时mysql数据发生变更,redis会同步吗?

1:【server3】 MariaDB [test]> select * from test; ##查看之前插入的数据 MariaDB [test]> update test set name=‘westos’ where id=1; ##更新 MariaDB [test]> select * from test; ##更新后的id=1,对应的name为westos #变更后发现,redis里没有变,浏览器也看不到变化,但是在redis里做的变化能看到 浏览器:172.25.78.1 刷新,并没有看到更新,这样显然不合理

2:配置gearmand

简介: Gearmand 是一个用来把工作委派给其它机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来调用其它语言的函数的系统。 简单来讲,就是客户端程序把请求提交给 gearmand,gearmand 会把请求转发给合适的 worker 来处理这个请求,最后还通过 gearmand 返回结果。 运行流程: Client --> Job --> Worker 1、Client 请求发起者,客户端程序可以是任何一种语言,C 、PHP 、Perl 、Python 等。 2、Job 请求调度者,负载协调把 Client 发出的请求转发给合适的 Worker。 3、Worker 请求处理者,处理 Job 分发来的请求,可以是任何一种语言

3:【server1】启动

systemctl start gearmand 4:【server3】解压lib_mysqludf_json-master.zip

yum whatprovides */unzip yum install unzip-60.-16.el7.x86_64 -y ##安装解压命令 unzip lib_mysqludf_json-master.zip yum install -y mariadb-devel.x86_64 #安装mariadb-devel yum insatl gcc -y ##解决依赖,防止编译的时候出错 > cd /root/redis/lib_mysqludf_json-master #编译模块(文档上有,注意路径) gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ #将模块放到mysql插件目录 5:【server3】查看

MariaDB [(none)]> show global variables like ‘plugin_dir’; #注册udf函数 MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME ‘lib_mysqludf_json.so’; 6:#安装插件管理gearman的分布式队列

cd redis/ --> ls tar zxf gearman-mysql-udf-0.6.tar.gz cd redis/rhel7 --> ls yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-* 7: 编译安装gearman插件

cd /root/redis/gearman-mysql-udf-0.6 ./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql make && make install

8:注册udf函数

mysql -uroot -predhat MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME ‘libgearman_mysql_udf.so’; MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME ‘libgearman_mysql_udf.so’; MariaDB [(none)]> select * from mysql.func; ##查看函数 MariaDB [(none)]> SELECT gman_servers_set(‘172.25.78.1:4730’); ##指定gman服务信息 9:编写mysql触发器

vim /root/redis/test.sql (将其他的全部注释)

1 use test; 5 DELIMITER $$ 6 CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN 7 SET @RECV=gman_do_background('syncToRedis',json_object(NEW.id as `id`, NEW.name as `name`)); 8 END$$ 9 DELIMITER ;

重新将文件内容导入数据库

[root@server3 ~]# mysql -p < test.sql ##查看触发器 MariaDB [(none)]> SHOW TRIGGERS FROM test; 10:【server1】 编写gman的worker端

cd redis/ --> ls cp worker.php /usr/local/ vim worker.php 7 $redis->connect(‘172.25.78.2’, 6379); nohup php /usr/local/worker.php &> /dev/null & ##后台运行worker 11:进行测试是否可以同步

【server3】修改数据库内容 MariaDB [(none)]> use test; MariaDB [test]> update test set name=‘mysql’ where id=2; MariaDB [test]> select * from test; 【server2】在redis上查看

[root@server2 ~]# redis-cli 127.0.0.1:6379> get 2 浏览器:页面查看,数据同步

最新回复(0)