linux小知识--CentOS7下Redis作为Mysql缓存开发(一)

前面几天写了两组文章,分别介绍了Mysql和Redis的安装及使用功能。
linux小知识–CentOS7安装配置开发Mysql全过程(一)
linux小知识–CentOS7安装配置开发Mysql全过程(二)
linux小知识–CentOS7安装配置开发Redis全过程(一)
linux小知识–CentOS7安装配置开发Redis全过程(二)
真是又菜又爱写
在这里插入图片描述
那大家就发现了mysql的持久化与redis的快,自然是我们都想要的鱼和熊掌,孟子说鱼和熊掌不能兼得,那是为什么呢?鱼和熊掌一起吃,也不会起什么反应吧。要不熊怎么吃鱼呢
在这里插入图片描述

倒是

酒和头孢,蟹与柿子不可兼得。 --王老师

既然鱼和熊掌可以一起吃,那么我们就来尝试一下,用redis作为mysql的缓存,进行数据的快速读取,
整个的流程图大概如下
在这里插入图片描述
读取
1)去redis读取,如果命中,则直接返回
2)如果没有命中,则去mysql读取,然后将返回结果更新到redis
写入
直接写mysql,然后数据自动同步到redis。
当然,勤劳的人也可以用代码实现,写mysql同时修改redis……
在这里插入图片描述
那我还在这说个啥,要的是
自动 自动 自动!!!!!!!!!!!!!!!!
在这里插入图片描述

下面就结合一个小的例子,先实现红色部分,数据写入。因为这里是一部分新的知识,也是难点,不过不怕,要有挑战才有意思。
在这里插入图片描述
首先介绍一下这部分用到的知识点,就是mysql的udf功能,

UDF是mysql的一个拓展接口,UDF(Userdefined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。
可以通过编写C语言版本的插件,插件内部提供自定义的函数,mysql中就可以直接调用了,就像内部的sum之类的函数

简单介绍一下就成,用起来自然就明白了。

在这里插入图片描述
首先是编写插件,这个插件就是连接mysql和redis的桥梁,c语言 编写,自然少不了hiredis库和mysql的头文件。

一个例子直接进入

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#define __USE_GNU
#include <sched.h>
#include <pthread.h>

#include "hiredis/hiredis.h"


my_bool syncip_init(UDF_INIT * initid, UDF_ARGS * args, char * message) 
{
	return 0;
}
void syncip_deinit(UDF_INIT* initid)
{  

}

int syncip(UDF_INIT * initid, UDF_ARGS * args, char * is_null, char * error) 
{
	redisContext * c = NULL;
	redisReply * r =NULL;
	
	c = redisConnect("127.0.0.1",6379);
	if(NULL==c)
	{
		return 1;
	}
	
	if(c->err==1)
	{
		return 2;
	}
	r = redisCommand(c, "auth password");
	freeReplyObject(r);

	if(*(int *)args->args[0] == 0)	//删除
	{
		r = redisCommand(c, "SREM ALLIPS %s",args->args[1]);
		freeReplyObject(r);
	}
	else if(*(int *)args->args[0] == 1)	//增加
	{
		r = redisCommand(c, "SADD ALLIPS %s",args->args[1]);
		freeReplyObject(r);
	}
	redisFree(c);
	return 0;
}

这个例子的功能就是用来记录或者删除redis中ALLIPS这个集合一个IP,mysql中插入一个某个IP,redis中就增加这个IP,mysql中删除这个IP,redis中也删除。

那我今天在这里说啥呢

插件文件中,有三个关键函数

  • syncip
  • syncip_init
  • syncip_deinit

syncip是函数主题,用来将mysql中传递过来的参数,经过判断,采用redis中的命令进行数据的删除或者增加
UDF_ARGS * args中传递过来的就是mysql语句中的参数,这个后面会讲。

syncip_init和syncip_deinit,就是初始化和结束调用的函数,一般用来申请和释放内存之类的。

然后就是编译这个插件,提供一个makefile,这就简单化了

CFLAGS= -shared -fPIC 
EXCFLAGS:=
EXTERLIBS:=
CROSS_COMPILE =
CFLAGS += 

CC=$(CROSS_COMPILE)gcc
STRIP=$(CROSS_COMPILE)strip


CFLAGS += $(EXCFLAGS) -DLINUX `mysql_config --cflags` -lhiredis

ROOTSRC = syncip_udf.c 
BIN = syncip.so

		
#//gcc生成main.out文件
$(BIN) : 
	$(CC) $(CFLAGS) -o $@ $(ROOTSRC)
##	$(STRIP) $@
#//表示.c 文件 依赖于 .o文件	
.c.o:
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	@echo "ROOTSRC:" $(ROOTSRC)
	rm -f $(BIN) 

最终会得到syncip.so,将它拷贝到插件目录即可,插件目录为/usr/lib64/mysql/plugin/。到此其实函数就已经可以用了,但是只是公用,谁都可以用,下面一步就是自动。

然后就是配置mysql,增加函数定义和触发器,因为我们需要在数据插入和删除的时候,执行我们的函数,所以采用触发器。
下面是sql文件

use mydb;
--创建函数
drop function if exists syncip;
create function syncip returns INTEGER soname "syncip.so";
--创建触发器
drop trigger if exists insert_redis;
drop trigger if exists delete_redis;

--定义触发器调用函数及传参
delimiter |

create trigger insert_redis
    after insert on hosts
    for each row
    begin
       declare ret int;
       select syncip(1, NEW.ipaddr) into @ret;

end|

create trigger delete_redis
    after delete on hosts
    for each row
    begin
        declare ret int;
        select syncip(0, OLD.ipaddr) into @ret;
    end|

delimiter ;

关键一点就在于

select syncip(1, NEW.ipaddr) into @ret;

这里就是插入时候,会调用syncip函数,将数字1和新插入的数据中ipaddr字段,传递过来,传递到
在这里插入图片描述
这两个参数中。是不是很简单。
我也以为这样就完事,可是怎么也调用不通,
在这里插入图片描述

结果发现是
在这里插入图片描述
返回了2,通过打印错误字符串,发现是
Permission denied
在这里插入图片描述

经过多方查证,是SELinux的问题导致,临时解决可以调用命令

setenforce 0

永久解决可以通过修改/etc/selinux/config,然后重启解决
在这里插入图片描述
至于为什么受selinux影响,还有待进一步研究。

那么回过头来第一步读取,将在下一章解答。今天就写到这里了。
其实每天把工作中用到的内容写一下,也是收获很多。
例如为什么头孢和酒不能一起吃

如果吃完头孢类的药物或者注射完头孢类药物再饮酒会发生“双硫仑样反应”,双硫仑样反应又称戒酒硫样反应,是由于服用药物(头孢类)后饮用含有酒精的饮品导致的体内“乙醛蓄积”的中毒反应。酒精在体内代谢时可以通过乙醇脱氢酶变成乙醛,正常情况下,乙醛会在乙醛脱酶催化下转变为乙酸,后期转化成水和二氧化碳。但头孢类药物的结构中有些东西会干扰乙醛脱氢酶的活性,造成乙醛在体内堆积,当酒进入体内经过乙醇脱氰酶的转化变成乙醛后,由于头孢类药物抑制了乙醛脱氢酶的活性,从而导致乙醛无法继续降解,在体内造成大量堆积,乙醛则对人体造成伤害。
“双硫仑样反应”于1948年被人发现,该反应主要症状为面部潮红、头痛、头晕、心悸、胸闷、恶心、呕吐、出汗等,更严重的会导致心动过速、心衰、急性心梗等危及生命。
所以应用头孢菌素类和甲硝唑类用药期间及治疗结束后72小时内,应避免饮酒或摄入含酒精的饮料,正常成人在服用头孢后3-5天后饮酒不会发生双硫仑反应。但是需要提出,婴儿及75 岁以上老年人的药物清除半衰期通常较正常成年人延长2-3倍。这类人群,如同时暴露于酒精和致病抗生素,需要提高警惕。

为什么柿子和螃蟹不能一起吃

柿子中有一种叫做“鞣酸”(又称“单宁酸”)的物质,在胃酸的作用下,与其他食物中的蛋白质发生反应,形成的一种不溶性结合物。当这些不溶性的结合物在胃中沉积后,就形成了结石。小一点的结石可以通过人体代谢排出体外,而大一点的则会压迫胃肠道,引起胃溃疡、胃出血或肠梗阻。
而螃蟹中恰恰就含有大量的蛋白质……

小心吃了结丹啊

在这里插入图片描述

马上就双十一了,还是要注意饮食,
在这里插入图片描述
不要总吃土

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值