文档章节

使用Redis做为MySQL的缓存

o
 osc_mervd488
发布于 2018/04/23 10:47
字数 493
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

OS: Ubuntu 16.04.4 x64

更新并安装必要的工具

apt update && apt upgrade -y && apt dist-upgrade -y
apt autoremove
apt autoclean
apt install gcc redis-server mysql-server libmysqld-dev libhiredis-dev -y

验证redis

127.0.0.1:6379> hgetall w3ckey
(empty list or set)
127.0.0.1:6379>

创建mysql数据

drop database if exists mysqlRedis;
create database mysqlRedis;
use mysqlRedis;

create table test(
        id INT NOT NULL AUTO_INCREMENT,
        name VARCHAR(64),
        age INT,
        description VARCHAR(1000),
        primary key(id));

创建UDF动态库 mysqlUDFdemo.c

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#include <hiredis/hiredis.h>

int gxupdate(UDF_INIT * initid, UDF_ARGS * args, char * is_null, char * error) {
        redisContext * c = redisConnect("127.0.0.1", 6379);
        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;
}

编译

gcc -shared -fPIC -I /usr/include/mysql -o udfgx.so mysqlUDFdemo.c /usr/lib/x86_64-linux-gnu/libhiredis.a

拷贝so文件到mysql plugin

cp udfgx.so  /usr/lib/mysql/plugin/

配置UDF和trigger

use mysqlRedis;

drop function if exists gxupdate;
create function gxupdate returns INTEGER soname "udfgx.so";

drop trigger if exists insert_redis;
drop trigger if exists update_redis;
drop trigger if exists delete_redis;

delimiter |

create trigger insert_redis
    after insert on test
    for each row
    begin
       declare ret int;
       select gxupdate(1, NEW.id, NEW.name, NEW.age, NEW.description) into @ret;
#必须加into @ret,否则返回错误ERROR 1415 (0A000) 
#at line 6: Not allowed to return a result set from a trigger
#insert只有NEW变量。
#update有NEW和OLD变量。
#delete只有OLD变量。
end|

create trigger update_redis
    after update on test
    for each row
    begin
        declare ret int;
        select gxupdate(1, NEW.id, NEW.name, NEW.age, NEW.description) into @ret;
    end|

create trigger delete_redis
    after delete on test
    for each row
    begin
        declare ret int;
        select gxupdate(0, OLD.id, OLD.name, OLD.age, OLD.description) into @ret;
    end|

delimiter ;

注意insert,update,delete要定义三个触发器
查看redis

127.0.0.1:6379> hgetall w3ckey
(empty list or set)
127.0.0.1:6379> 

插入数据

mysql> insert into test (name, age, description) values ("ggglwlop", 23, "ddddgdg");
Query OK, 1 row affected (0.02 sec)

查看redis

127.0.0.1:6379> hgetall w3ckey
1) "name"
2) "ggglwlop"
3) "description"
4) "ddddgdg"
5) "likes"
6) "27"
7) "visitors"
8) "23"
127.0.0.1:6379> 

mysql的改动已经缓存到了redis中

这里有一个github上不错的项目:

https://github.com/liukelin/canal_mysql_nosql_sync

参考:

https://blog.csdn.net/gx_1983/article/details/79033502
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

在Bash脚本中,如果发生某种情况,如何退出整个脚本?

问题: I'm writing a script in Bash to test some code. 我正在Bash中编写脚本来测试一些代码。 However, it seems silly to run the tests if compiling the code fails in the first pl......

技术盛宴
31分钟前
11
0
Windows安装Python+OpenCV

1、更新PyCharm中pip来源,使用清华和阿里云:https://pypi.tuna.tsinghua.edu.cn/simple/ http://mirrors.aliyun.com/pypi/simple/ 2、PyCharm查看已安装packets,添加新的安装包,从pip云端...

极客行
54分钟前
17
0
tomcat8配置虚拟目录,实现一个tomcat运行两个项目, tomcat配置URL不区分大小写

<?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distri......

青峰Jun19er
今天
19
0
HBase和MySQL存储方式的差别?或者说是,行存储和列存储的区别?

HBase借鉴列存储的思想,但是最底层依然是依靠键值对来存储数据,HBase为非关系型数据库 而MySQL则是行存储,MySQL为关系型数据库 写过程 行存储因为数据是连续的,所以只需要进行追加即可;...

其乐m
今天
25
0
一个老程序员在互联网寒冬下的感悟

1. 你千万不要认为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场开发,跑腿的人,没有前途。 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开...

北柠Java
今天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部