哈喽,大家好,我是指北君。不知道大家出去面试有没有被问到过如何保证数据库与缓存一致性问题呢?大家又是如何回答的呢?,缓存一致性 每次逢年过节的时候抢票非常艰难,放票的时候那么多人同时去抢票,如果所有人查询、购票等都去访问数据库,那数据库的压力得有多大,这时候很多都会引入缓存, 把车票信息放入缓存,这样可以减少数据库压力。当乘客购买成功之后,数据库发生了变化,需要及时更新缓存中的数据,以便于其他乘客能从缓存中及时获取最新车票信息。这就是缓存一致性。,解决数据库与缓存一致性主要思路:,那我们有没有什么更加好的解决方案呢?,阿里云的canal就为我们很好的解决了这一问题:,canal: 是Alibaba旗下的一款开源项目,纯Java开发.它是基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持mysql。,mysql的主从复制原理:,canal工作原理,一、登进Mysql后,使用show variables like’log_bin’;查询是否开启binlog,如果开启(ON),进行下一步,如果没开启(OFF),在数据库的my.ini配置文件添加配置,二、binlog开启后,创建一个canal用户并授权,官网配置是@%,表示所有服务器,所以改为localhost就可以,在mysql中,运行如下代码,设置完成之后重启:,三、安装canal,下载地址:https://github.com/alibaba/canal/releases/tag/canal-1.1.6-alpha-1,在conf文件夹里找到\conf\canal.properties,说明:这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111,修改 canal 的输出 model,默认 tcp,改为输出到 kafka,重点关注上面的:canal.serverMode = tcp 这个配置,默认情况,如果是使用mysql,可以不做修改,如果需要将数据同步到kafka,或者rocketmq,可以分别修改即可,此处暂不做修改,解压到适当位置,解压后在conf文件夹里找到\example\instance.properties,,canal.instance.mysql.slaveId=20 #只要和mysql的master的不一样即可,canal.instance.master.address=127.0.0.1:3306 ,监听的mysql的master节点信息,配置连接 MySQL 的用户名和密码,默认就是我们前面授权的 canal,修改数据库配置信息,canal.instance.dbUsername、canal.instance.dbPassword为数据库账户密码,均为canal,刚刚创建账号密码,,,到bin目录下启动 startup.bat,出现如下界面表示启动成功,,四、spring boot中整合canal maven依赖,java 示例:,我手动在book表中操作数据,可以看到程序监控输出结果,,五、 最后我们拿到数据之后可以放入消息队列,这样可以加入重试机制,还可以防止幂等问题,最后再写入缓存。,,消息队列保证可靠性:写到队列中的消息,成功消费之前不会丢失(重启项目也不担心)。,消息队列保证消息成功投递:下游从队列拉取消息,成功消费后才会删除消息,否则还会继续投递消息给消费者(符合我们重试的场景)。
© 版权声明
文章版权归作者所有,未经允许请勿转载。