redis服务

本文介绍了Redis的安装、数据类型、主从复制、主从切换、集群建立以及使用PHP连接Redis。还详细讲解了配置Gearman实现数据同步的过程,包括安装lib_mysqludf_json、gearman-mysql-udf,编写MySQL触发器和Gearman worker端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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端更新了

刷新访问页面也更新了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值