开发者社区> 问答> 正文

Redis与Mysql实时同步?

数据库数据一旦变了,缓存里面能够快速更新

展开
收起
试用期 2017-06-02 21:19:31 8348 0
5 条回答
写回答
取消 提交回答
  • 你可以通过MySql自定义函数 (user-defined function UDF),添加一个请求RedisClient的方法,然后在你需要MySql实时同步的地方,进行触发器掉用自定义函数,获取触发器内操作的数据,然后通过UDF直接同步到Redis中。 之前做的类似触发器,你可以参考一下:

    -- 选择执行数据库 use taxdischosting; -- 删除UDF自定义Redis客户端方法 drop function if exists rediscli; -- 注册添加UDF自定义Redis客户端方法 create function rediscli returns integer soname "RedisDll.dll";

    -- 删除操作触发器 drop trigger if exists insert_redis; drop trigger if exists update_redis; drop trigger if exists delete_redis;

    -- 创建添加触发器 create trigger insert_redis after insert on tax_disc for each row begin -- 设置REDIS中KEY set @k=CONCAT(new.plateno,'_',new.platesign); -- 设置REDIS中VAL set @v=CONCAT( "{", """""""plateno"""""":""""""",IFNULL(new.plateno,-1),""""""",", """""""platenumber"""""":""""""",IFNULL(new.platenumber,-1),""""""",", """""""platename"""""":""""""",HEX(IFNULL(new.platename,-1)),""""""",", """""""platesign"""""":""""""",IFNULL(new.platesign,-1),""""""",", """""""stime"""""":""""""",IFNULL(new.stime,-1),""""""",", """""""etime"""""":""""""",IFNULL(new.etime,-1),""""""",", """""""ctime"""""":""""""",IFNULL(new.ctime,-1),""""""",", """""""cuser"""""":""""""",IFNULL(new.cuser,-1),"""""""", "}" );

        -- 掉用UDF客户端函数同步REDIS
        select rediscli('D:\\RedisApp\\Redis\\redis-cli.exe',CONCAT('-h 127.0.0.1 -p 6379 -n 2 set ',@k,' ',@v)) into @ret;
    end;
    

    -- 创建更新触发器 create trigger update_redis after update on tax_disc for each row begin -- 设置REDIS中KEY set @k=CONCAT(new.plateno,'_',new.platesign); -- 设置REDIS中VAL set @v=CONCAT( "{", """""""plateno"""""":""""""",IFNULL(new.plateno,-1),""""""",", """""""platenumber"""""":""""""",IFNULL(new.platenumber,-1),""""""",", """""""platename"""""":""""""",HEX(IFNULL(new.platename,-1)),""""""",", """""""platesign"""""":""""""",IFNULL(new.platesign,-1),""""""",", """""""stime"""""":""""""",IFNULL(new.stime,-1),""""""",", """""""etime"""""":""""""",IFNULL(new.etime,-1),""""""",", """""""ctime"""""":""""""",IFNULL(new.ctime,-1),""""""",", """""""cuser"""""":""""""",IFNULL(new.cuser,-1),"""""""", "}" );

        -- 掉用UDF客户端函数同步REDIS
        select rediscli('D:\\RedisApp\\Redis\\redis-cli.exe',CONCAT('-h 127.0.0.1 -p 6379 -n 2 set ',@k,' ',@v)) into @ret;
    end;
    

    -- 创建删除触发器 create trigger delete_redis after delete on tax_disc for each row begin -- 设置REDIS中KEY set @k=CONCAT('D:\RedisApp\Redis\redis-cli.exe','-h 127.0.0.1 -p 6379 -n 2 del ',old.plateno,'_',old.platesign); -- 掉用UDF客户端函数同步REDIS select rediscli(@k) into @ret; end;

    2019-09-26 17:34:07
    赞同 展开评论 打赏
  • 就职于阿里云数据库技术组,从事redis引擎开发工作,https://github.com/soloestoy

    redis或者MySQL本身没有这类功能,需要你自己去实现,类似的:

    如果要求强一致:

    1. 读:读redis,没有数据的话从MySQL把数据读取到redis再返回
    2. 写:同时写redis和MySQL

    如果可以容忍不一致可以定时更新

    2019-07-17 21:15:08
    赞同 1 展开评论 打赏
  • 下面为通过gearman的实现,转载自:
    http://www.linuxidc.com/Linux/2015-01/111380.htm

    2019-07-17 21:15:08
    赞同 展开评论 打赏
  • 这是两种不同的产品。

    2019-07-17 21:15:08
    赞同 展开评论 打赏
  • 博客:http://nginxs.blog.51cto.com/ github:https://github.com/bashhu

    应该没有你说的功能。
    干脆在你修改数据库的操作那里添加下redis的操作,
    当然这种操作如果太频繁建议加一个crontab,定时更新数据

    2019-07-17 21:15:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis集群演化的心路历程——从2.x到3.0时代 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载

相关镜像