使用redis做为MySQL的缓存

使用redis做为MySQL的缓存

介绍
•在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库;即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到磁盘IO操作(MySQL也有一些数据预读技术,能够减少磁盘IO读写,此部分后续继续研究),总之,直接从MySQL中读取数据不如直接从内存中读取数据来的效率高。为了提高数据库访问效率,人们采用了各种各样的方法,其中方法之一就是使用一个给予内存的缓存系统放置在数据库和应用程序之间。在查找数据的时候,首先从内存中查找,如果找到则使用,如果没有找到,那么再真正访问数据库。这种方法在一些场景下(例如:频繁查找相同数据)能够提高系统的整体效率。

•本文的主要目的即介绍上文说的这样一种方法,采用redis nosql数据库作为Mysql数据库的缓存,在查找的时候,首先查找redis缓存,如果找到则返回结果;如果在redis中没有找到,那么查找Mysql数据库,找到的花则返回结果并且更新redis;如果没有找到则返回空。对于写入的情况,直接写入mysql数据库,mysql数据库通过触发器及UDF机制自动把变更的内容更新到redis中。
框图
  
1、读取步骤:`

1.client读取redis,如果命中返回结果,如果没有命中转到2. 
2.client读取数据库,在数据库中没有查到,返回空;在数据库中查到了,
返回查到的结果并更新Redis。

2.写入步骤:

1. client修改/删除或者新增数据到MySQL。 
2. MySQL的触发器调用用户自定义的UDF。 
3. UDF把修改/删除或者新增的数据更新到redis中。

代码实现
软件需求
•redis server与client安装,redis编程相关的c库。•mysql server安装,mysql-devel包的安装,此包包含操作mysql数据库的C语言API包。

实现步骤

  1. 安装并验证redis
127.0.0.1:6379> hgetall w3ckey
(empty list or set)    #最开始在reids中没有w3ckey的K-V对。
127.0.0.1:6379> 
  1. 安装MySQL数据库服务器

2.1 创建MySQL数据库的脚本如下

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));
 

2.2 创建UDF使用的动态库

#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;
  }   
   /*
   //如果设有密码为ubuntu redisReply *reply; 
   char strReply[] = "AUTH ubuntu"; 
   reply = (redisReply*)redisCommand(c, strReply);
   freeReplyObject(reply); 
   reply = NULL;
   */
const char * command1 = "HMSET w3ckey id %d name %s age %d description %s";  
redisReply * r = (redisReply *)redisCommand(c, command1,  
*(int*)args->args[0], args->args[1], *(int *)args->args[2], 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 udfredis.so mysqlUDFdemo.c /usr/local/lib/libhiredis.a 

编译完成之后拷贝动态库udfgx.so到 /usr/lib/mysql/plugin/文件夹中,并修改成用户对应权限。

2.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 test1
    for each row
    begin
       declare ret int;
       select gxupdate(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 test1
    for each row
    begin
        declare ret int;
        select gxupdate(NEW.id, NEW.name, NEW.age, NEW.description) into @ret;
    end|

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

delimiter ;

注意,在MySQL中创建UDF的时候,insert, update和delete不能写成一个触发器,只能分别定义成三个触发器。

测试
查看redis

[root@VM_24_16_centos mysql_redis]# redis-cli
127.0.0.1:6379> hgetall w3ckey
(empty list or set)
127.0.0.1:6379> redis中无key w3ckey 对应的value。

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

mysql> 

插入mysql。

查看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中有了对应的数据,说明mysql通过triger+udf的方式把改动更新到了redis中。

有用的链接

http://blog.csdn.net/socho/article/details/52292064
https://www.cnblogs.com/linuxbug/p/4950626.html
https://www.cnblogs.com/tommy-huang/p/4703514.html  使用redis作为mysql缓存时的redis结构设计。
http://blog.csdn.net/shikaiwencn/article/details/51792059    需要根据实际需求来灵活设计redis kv关系。
https://www.cnblogs.com/bruceleeliya/archive/2009/05/23/Linux-C-Mysql.html  使用mysql的C API访问mysql。
https://www.2cto.com/database/201110/108925.html  #mysql udf。
https://www.cnblogs.com/linuxbug/p/4950626.html  #udf使用的一个例子。
https://www.jianshu.com/p/4381a38403a1
http://blog.csdn.net/socho/article/details/52292064

转载自:https://www.cnblogs.com/henryliublog/p/9170666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值