redis缓存与数据库一致性
解决方案:
1.1实时同步
对强一致性要求较高的,应采用实时同步方案,即查询缓存查询不到再从DB查询,保存到缓存;更新缓存时,先更新数据库,再将缓存设置为过期(建议不要去更新缓存内容,直接设置缓存过期)
用到的注解:
- @Cacheable: 查询时使用,注意long类型需要转化为string类型,否则会抛异常
- @CachePut:更新时使用,使用此注解,一定会从DB上查数据
- @CacheEvict:删除时使用
- @Caching:组合用法
1.2异步队列
对于并发程度较高的,可采用异步队列的方式同步,采用kafka等消息中间件处理消息生产和消费
1.3使用阿里的同步工具canal
canal实现方式是模拟mysql slave和master的同步机制,监控DB bitlong的日志更新来触发缓存的更新,此种方法可以解放程序员双手,减少工作量,但在使用时有些局限性。
关于mysql主从复制:
(1).master将改变记录到二进制日志(binary log)中(这些记录即二进制日志事件,binary log events可以通过show binary events进行查看)
(2).slave 将master的binary log events 拷贝到它的中继日志(relay log)
(3).slave重做中继日志中的事件,将改变反映它自己的数据
canal的工作原理:
1.canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2.MySQL master收到dump请求,开始推送binary blog给slave(就是canal)
3.canal解析binary log对象(原始为byte 流)
1.4.采用UDF自定义函数的方式
面对mysql的API进行编程,利用触发器进行缓存同步,但UDF主要是c/c++实现,学习成本高。