mysql前置缓存redis是我们经常使用的提供性能的方案。

常规使用

1、基于binlog使用mysql_udf_redis,将数据库中的数据同步到Redis。

      无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。

      那么理论上我们也可以用同样方式,分析MySQL的binlog文件并将数据插入Redis。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的。

2、通过MySQL自动同步刷新Redis

     当我们在业务层有数据查询需求时,先到Redis缓存中查询,如果查不到,再到MySQL数据库中查询,同时将查到的数据更新到Redis里;当我们在业务层有修改插入数据需求时,直接向MySQL发起请求,同时更新Redis缓存。 就是MySQL的CRUD发生后自动地更新到Redis里,这需要通过MySQL UDF来实现。具体来说,我们把更新Redis的逻辑放到MySQL中去做,即定义一个触发器Trigger,监听CRUD这些操作,当操作发生后,调用对应的UDF函数,远程写回Redis,所以业务逻辑只需要负责更新MySQL就行了,剩下的交给MySQL UDF去完成。

总结

在我们的实际开发当中往往采用如下方式实现实现Mysql和Redis数据同步:当我们在MySQL数据库中进行增删改的时候,我们在增删改的service层将缓存中的数据清除,这个时候用户在此请求的时候我们缓存中没有数据了,直接去数据库中查询,查询回来之后将缓存中的数据放缓存当中,这个时候缓存中的数据就是最新的数据。

实战

后台服务器信息查询

1、后台重kafka订阅信息,如果有服务器信息,后台系统进行消费,放入到mysql数据库中

2、很多场景都需要查询服务器的信息,比如我们接受到的zbabix的数据,需要根据ip的去查询服务器的信息

3、这边在查询之间就加了一层redis缓存,先去redis缓存查数据,如果查到数据,就返回,如果没有查到数据就到mysql数据库进行查询,将查到的数据返回的同时更新到redis中,key是IP,json信息是value,同时设置过期事件,用来保存经常查询的数据。