怎么用织梦做自己的网站,app运营,正规的徐州网站开发,网站如何免费做SEO优化介绍 在实际项目中#xff0c;MySQL数据库服务器有时会位于另外一台主机#xff0c;需要通过网络来访问数据库#xff1b;即使应用程序与MySQL数据库在同一个主机中#xff0c;访问MySQL也涉及到磁盘IO操作#xff08;MySQL也有一些数据预读技术#xff0c;能够减少磁盘I…介绍 在实际项目中MySQL数据库服务器有时会位于另外一台主机需要通过网络来访问数据库即使应用程序与MySQL数据库在同一个主机中访问MySQL也涉及到磁盘IO操作MySQL也有一些数据预读技术能够减少磁盘IO读写此部分后续继续研究总之直接从MySQL中读取数据不如直接从内存中读取数据来的效率高。为了提高数据库访问效率人们采用了各种各样的方法其中方法之一就是使用一个给予内存的缓存系统放置在数据库和应用程序之间。在查找数据的时候首先从内存中查找如果找到则使用如果没有找到那么再真正访问数据库。这种方法在一些场景下例如频繁查找相同数据能够提高系统的整体效率。 本文的主要目的即介绍上文说的这样一种方法采用redis nosql数据库作为Mysql数据库的缓存在查找的时候首先查找redis缓存如果找到则返回结果如果在redis中没有找到那么查找Mysql数据库找到的花则返回结果并且更新redis如果没有找到则返回空。对于写入的情况直接写入mysql数据库mysql数据库通过触发器及UDF机制自动把变更的内容更新到redis中。 框图 读取步骤
client读取redis,如果命中返回结果如果没有命中转到2.client读取数据库在数据库中没有查到返回空在数据库中查到了返回查到的结果并更新Redis。 写入步骤client修改/删除或者新增数据到MySQL。MySQL的触发器调用用户自定义的UDF。UDF把修改/删除或者新增的数据更新到redis中。 代码实现 软件需求 redis server与client安装redis编程相关的c库。 mysql server安装mysql-devel包的安装此包包含操作mysql数据库的C语言API包。 实现步骤 6. 安装并验证redis
127.0.0.1:6379 hgetall w3ckey
(empty list or set) #最开始在reids中没有w3ckey的K-V对。
127.0.0.1:6379安装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.hint 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;}/*//如果设有密码为ubunturedisReply *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_redisafter insert on test1for each rowbegindeclare 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_redisafter update on test1for each rowbegindeclare ret int;select gxupdate(NEW.id, NEW.name, NEW.age, NEW.description) into ret;end|create trigger delete_redisafter delete on test1for each rowbegindeclare ret int;select gxupdate(OLD.id, OLD.name, OLD.age, OLD.description) into ret;end|delimiter ;注意在MySQL中创建UDF的时候insert, update和delete不能写成一个触发器只能分别定义成三个触发器。
测试 查看redis
[rootVM_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通过trigerudf的方式把改动更新到了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