1.redis与mysql之间关系
读取步骤:
(1)client读取redis,若查到则返回结果;反之,进行第2步骤。
(2)client读取数据库,在数据库中若查到,则读取返回结果并更新至redis中;反之,若未查到则返回空。
写入步骤:
(1)client增删改数据到mysql。
(2)mysql触发器调用用户自定义的UDF。
(3)UDF把增删改的数据更新到redis中。
2.redis和mysql实现环境
(1)redis相关软件
切换目录:cd /usr/local/redis/bin
redis-cli、redis-server、gcc版本均已安装,具体安装参照https://blog.csdn.net/weixin_47427038/article/details/110306159
拓展:
redis-benchmark:压力测试工具
redis-check-aof:检查redis持久化命令文件的完整性
redis-check-rdb:检查redis持久化数据文件的完整性
redis-cli:redis在linux下的客户端
redis-sentinel -> redis-server:redis-sentinel是集群管理工具,主要负责主从切换
redis-server:redis服务器的daemon启动程序
(2)mysql相关软件
切换目录:cd /usr/lib/systemd/system
mysql-server,mysql-devel已安装,具体安装参照:https://blog.csdn.net/weixin_47427038/article/details/110490494
3.登录redis
切换目录:cd /usr/local/redis/bin/
启动redis:./redis-server /usr/local/bin/redis-cluster/6001/redis.conf
登录redis:./redis-cli -h 192.168.229.130 -c -p 6001
验证redis:hgetall www2
4.创建mysql数据库脚本
切换目录:cd /usr/local/mysql/
创建文件:touch myredis.sql
编辑文件:vim myredis.sql
drop database if exists mysqlRedis;
create database mysqlRedis;
use mysqlRedis;
create table test1(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(64),age INT,description VARCHAR(1000),primary key(id));
重新打开一个xshell窗口,切换目录:cd /usr/lib/systemd/system
登录数据库:mysql -u root -p,回车,输入密码,回车
输入命令:source /usr/local/mysql/myredis.sql;
拓展:数据库中也可以直接进行增删改查操作。
5.创建UDF.c文件
(1)切换目录:cd /usr/local/mysql/
(2)创建文件:touch UDF.c
(3)编辑文档内容:vim UDF.c
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#include </usr/local/redis-5.0.4/deps/hiredis/hiredis.h>
int gxupdate(UDF_INIT * initid, UDF_ARGS * args, char * is_null, char * error) {
redisContext * c = redisConnect("192.168.229.130", 6001);
if(c->err) {
redisFree(c);
return 1;
}
const char * command1 = "HMSET w3ckey name %s description %s likes %d visitors %d";
redisReply * r = (redisReply *) redisCommand(c, command1,
args->args[2], args->args[4], *(int *)args->args[1], *(int *)args->args[3]);
if(r == NULL) {
return 1;
}
if(!((r->type == REDIS_REPLY_STATUS) && (strcasecmp(r->str, "OK") == 0))) {
freeReplyObject(r);
redisFree(c);
return 1;
}
freeReplyObject(r);
return 0;
}
my_bool gxupdate_init(UDF_INIT * initid, UDF_ARGS * args, char * message) {
return 0;
}
(4)编译UDF.c文档:gcc -shared -fPIC -I /usr/include/mysql -o udfgx.so UDF.c /usr/local/lib/libhiredis.a
出现问题:
解决方法:
查找deps文件:find / -name deps
切换目录:cd /usr/local/redis-5.0.4/deps
进行创建:make lua hiredis linenoise
切换目录:cd /usr/local/mysql/
重新编译:gcc -shared -fPIC -I /usr/include/mysql -o udfgx.so UDF.c /usr/local/redis-5.0.4/deps/hiredis/libhiredis.a