redis软件下载地址:Redis
redis安装:
yum install gcc -y
tar zxf redis-5.0.8.tar.gz
make && make install
utils/install_server.sh
redis支持的数据类型:
• 字符串(strings)
• 散列(hashes)
• 列表(lists)
• 集合(sets)
• 有序集合(sorted sets)
redis常用命令:
config get * | 查看配置 |
select 1 | 选择数据库 |
flushdb | 清空当前数据库 |
flushall | 清空所有数据库 |
move key 1 | 移动key |
del key | 删除 |
rename oldkey newkey | 改名 |
expire key 10 | 设置过期时间 |
persist key | 设置持久化 |
keys user* | 查询 |
exists key | 判断是否存在 |
主从复制
server1中
[root@server2 redis]# vim 6379.conf
bind 0.0.0.0
server2中
[root@server2 utils]# vim install_server.sh ##注释掉
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
[root@server2 utils]# ./install_server.sh
[root@server2 utils]# cd /etc/redis/
[root@server2 redis]# vim 6379.conf
bind 0.0.0.0
replicaof 172.25.6.1 6379
[root@server2 redis]# /etc/init.d/redis_6379 restart
[root@server2 redis]# redis-cli
测试:
server1中:
server2中:
主从切换
将server3也添加slave
在server1中:
[root@server1 utils]# cd
[root@server1 ~]# cd redis-6.2.4/
[root@server1 redis-6.2.4]# cp sentinel.conf /etc/redis/
[root@server1 redis-6.2.4]# cd /etc/redis
[root@server1 redis]# ls
6379.conf sentinel.conf
[root@server1 redis]# vim sentinel.conf
sentinel monitor mymaster 172.25.6.1 6379 2
sentinel down-after-milliseconds mymaster 10000
[root@server1 redis]# scp sentinel.conf server2:/etc/redis/
[root@server1 redis]# scp sentinel.conf server3:/etc/redis/
[root@server1 redis]# redis-sentinel /etc/redis/sentinel.conf
[root@server2 redis]# redis-sentinel /etc/redis/sentinel.conf
[root@server3 redis]# redis-sentinel /etc/redis/sentinel.conf
测试:
关闭 server1
[root@server1 redis-6.2.4]# redis-cli
127.0.0.1:6379> shutdown
not connected>
之后可以看到master变了,3经过投票变为新的master
启动1,1变成了slave
配置文件会自己生成
建立集群
通过脚本建立
[root@server1 redis]# cd
[root@server1 ~]# cd redis-6.2.4/
[root@server1 redis-6.2.4]# cd utils/
[root@server1 utils]# cd create-cluster/
[root@server1 create-cluster]# ls
create-cluster README
[root@server1 create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
[root@server1 create-cluster]# ./create-cluster create
生成三组
30005对应的master是30001,30004对应的master是30003,30006对应的master是30002
[root@server1 create-cluster]# cat 30001.log 查看日至有警告
修改
[root@server1 create-cluster]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory = 1
关闭30001,可以看到30005变为master
再打开30001[root@server1 create-cluster]# ./create-cluster start
可以看到30001变为30005的slave
注意:哈西槽一定要够,否则会崩盘,删除一组就崩盘
配置文件改为8就一次产生8个
[root@server1 create-cluster]# redis-cli --cluster add-node 127.0.0.1:30007 127.0.0.1:30001
添加master7
[root@server1 create-cluster]# redis-cli --cluster add-node 127.0.0.1:30008 127.0.0.1:30001 --cluster-slave --cluster-master-id 250717c7ce09f8fc5b87357f87a63ad1c804482e ##添加30007的slave 30008
给30007分配哈西槽
[root@server1 create-cluster]# redis-cli --cluster reshard 127.0.0.1:30001
PHP与redis连接
环境搭建nginx和php
server3中添加一个测试页
[root@server3 ~]# cp test.php /usr/local/nginx/html/
[root@server3 ~]# cd /usr/local/nginx/html/
[root@server3 html]# vim test.php
server4中添加一个测试库并设置权限
[root@server4 ~]# mysql test < test.sql
MariaDB [test]> grant all on test.* to redis@'%' identified by 'westos';
Query OK, 0 rows affected (0.00 sec)
server3中安装php的依赖
[root@server3 html]# yum install php -y
[root@server3 html]# yum install php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm -y
[root@server3 html]# yum install php-pecl-redis-2.2.8-1.el7.x86_64.rpm -y
[root@server3 html]# yum install -y php-mysql
[root@server3 html]# php -m |grep mysql
mysql
mysqli
pdo_mysql
[root@server3 html]# php -m |grep redis
redis
[root@server3 html]# systemctl reload php-fpm ##平滑加载
访问可以看到
刷新一下
在server4中修改数据
MariaDB [test]> update test set name='westos' where id=1
-> ;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [test]> select * from test;
但是server2中没改,删除1
刷新网页已更改
如果在2 中直接修改会直接生效
此处还存在问题,接下来优化
配置 gearman 实现数据同步
Gearman 是一个支持分布式的任务分发框架:
Gearman Job Server: Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接
下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。
我们需要将数据库数据进行映射,方便传输
安装 lib_mysqludf_json
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映
射为 JSON 格式,是通过程序来转换的。
需要安装gcc、mariadb-devel和lib_mysqludf_json-master
[root@server4 ~]# yum install -y mariadb-devel.x86_64
[root@server4 ~]# unzip lib_mysqludf_json-master.zip
[root@server4 lib_mysqludf_json-master]# yum install -y gcc
[root@server4 lib_mysqludf_json-master]# yum install -y gcc
[root@server4 lib_mysqludf_json-master]# ls
lib_mysqludf_json.c lib_mysqludf_json.so README.md
lib_mysqludf_json.html lib_mysqludf_json.sql
[root@server4 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
[root@server4 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ ##拷贝 lib_mysqludf_json.so 模块
plugin所在目录如图
[root@server4 plugin]# mysql
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; ##注册 UDF 函数
MariaDB [(none)]> select * from mysql.func;
安装 gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列
[root@server4 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
[root@server4 ~]# ls
gearman-mysql-udf-0.6 libgearman-devel-1.1.12-18.el7.x86_64.rpm
gearman-mysql-udf-0.6.tar.gz lib_mysqludf_json-master
libevent-devel-2.0.21-4.el7.x86_64.rpm lib_mysqludf_json-master.zip
libgearman-1.1.12-18.el7.x86_64.rpm test.sql
[root@server4 ~]# yum install -y libgearman-* libevent-*
[root@server4 gearman-mysql-udf-0.6]# ./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql
[root@server4 gearman-mysql-udf-0.6]# make && make install
注册 UDF 函数
[root@server4 ~]# mysql
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';
查看函数
[root@server3 ~]# ls
gearmand-1.1.12-18.el7.x86_64.rpm nginx-1.20.2.tar.gz
libevent-devel-2.0.21-4.el7.x86_64.rpm php-fpm-5.4.16-46.el7.x86_64.rpm
libgearman-1.1.12-18.el7.x86_64.rpm redis-6.2.4
libgearman-devel-1.1.12-18.el7.x86_64.rpm redis-6.2.4.tar.gz
nginx-1.20.2 test.php
[root@server3 ~]# yum install -y libgearman-1.1.12-18.el7.x86_64.rpm gearmand-1.1.12-18.el7.x86_64.rpm
[root@server3 ~]# netstat -antlp
server3中要开启4730端口
mysql端指定 gearman 的服务信息
编写 mysql 触发器
[root@server4 ~]# 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');
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
END$$
DELIMITER ;
~
[root@server4 ~]# mysql < test.sql
MariaDB [(none)]> SHOW TRIGGERS FROM test;
编写 gearman 的 worker 端
[root@server3 ~]# vim worker.php
[root@server3 ~]# php -m |grep redis
redis
[root@server3 ~]# php -m |grep gearman ##我们需要开启这个
[root@server3 ~]# yum install -y php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
[root@server3 ~]# php -m |grep gearman
gearman
[root@server3 ~]# systemctl reload php-fpm
[root@server3 ~]# mv worker.php /usr/local
[root@server3 ~]# php /usr/local/worker.php ##开启
[root@server3 ~]# php /usr/local/worker.php 开启时我们去更改数据库
可以看到redis端更新了
刷新访问页面也更新了