高性能服务器之--使用redis实现Mysql缓存功能

系列文章目录

第一章 高性能服务器结构分析 第二章 实现简单的web请求与响应 第三章 实现非活跃用户检测与处理 第四章 实现服务器日志系统 第五章 使用redis实现MySQL缓存功能 第六章 高性能服务器之CDN



前言

为了提高服务器处理请求的并发能力,如果服务器直接去Mysql数据库去直接获取数据,这样会面临处理大量的IO请求的情况,使得服务器并发能力较低,为此我们可以根据系列文章第一章节中介绍的高性能服务器架构中说的那样,在服务器与数据库之间加上一层缓存,在我的项目中使用的redis。


一、redis是什么?

redis是有C开发的一款功能强大的键值对数据库,数据存于内存间,服务器访问快。

二、redis与MySQL的具体运作逻辑

三、案例实现

1.实现案例介绍

在本专栏中,数据库用来存放用户的用户名和密码,开始使用的是map来保存Mysql中的用户名和密码,我们现在用redis来进行缓存,用户登录时候先访问redis,进行校验,如果没有就会报错,提示注册。如果是在注册情况下,就是需要对数据库进行写操作,那么就直接写数据库,然后数据库的触发器自动同步新消息到redis中。

2.具体操作

###1.创建用户表格

drop database if exists mysqlRedis;
create database mysqlRedis;
use mysqlRedis;
create table user(
        name varchar(10),
        passwd VARCHAR(10),
        );

###2.创建UDF动态库mysql_redis.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 = "HSET mysql_cache name %s passwd %s";
        redisReply * r = (redisReply *) redisCommand(c, command1,args->args[0], args->args[1]);
        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

###3.配置UDF和trigger

use mysqlRedis;
drop function if exists gxupdate;
create function gxupdate returns INTEGER soname "udfredis.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.name, NEW.passwd)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 ;

###4.案例演示 1 往user表中添加信息:

2 查看mysql_cache信息:

四.附页

经验分享 程序员 微信小程序 职场和发展