Redis学习笔记---Redis缓存与数据库一致性

一. 解决Redis缓存与数据库一致性的问题(面试题)

1.实时同步

[1] 对强一致要求比较高的,应采用实时同步方案。即查询缓存查询不到,再从DB查询,并保存到缓存中;更新缓存时,先更新数据库,再将缓存设置过期(建议不要去更新缓存内容,直接设置缓存过期。如果直接更新缓存内容的话有可能某一段时间为空值,这时很多用户又得同时查询数据库,很容易造成缓存雪崩。)
[2] 使用Java整合Redis时可以用如下注解来实现实时同步:

@Cacheable: 查询时使用,注意Long类型需转换为String 类型,否则会抛异常
@CachePut: 更新时使用,使用此注解,一定会从DB上查询数据
@CacheEvict: 删除时使用
@Caching:  组合用法
2. 异步队列

对于并发程度较高的,可采用异步队列的方式同步,可采用kafka 等消息中间件处理消息生产和消费。
Redis学习笔记---Redis缓存与数据库一致性_第1张图片

3.使用阿里的同步工具canal

canal 实现方式是模拟mysql 的 slave和master 的同步机制(主从同步机制),监控 DB bitlog的日志更新来触发缓存的更新,此种方法可以解放程序员双手,减少工作量,但在使用时有些局限性。
[1] mysql的主从同步机制
Redis学习笔记---Redis缓存与数据库一致性_第2张图片
步骤说明:
1>master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件(binary log events),可以通过 show binlog events 进行查看)
2>slave 将master的binary log events 拷贝到它的中继日志(relay log)
3>slave 重做中继日志中的事件,将改变反映它自己的数据

[2] canal的工作原理:
Redis学习笔记---Redis缓存与数据库一致性_第3张图片
步骤说明:
1> canal模拟mysql slave 的交互协议,伪装自己为mysql slave 发送 dump协议
2> mysql master 收到dump请求,开始推送binary log 给slave(也就是canal)
3> canal 解析binary log 对象(原始为byte流)

4.采用UDF自定义函数的方式

[1] 面对mysql的API进行编程,利用触发器进行缓存同步,但UDF主要是c/c++语言实现,学习成本高。
[2] 其他方法:编写Lua脚本,定时做同步功能。这也属于一种触发器的方式。每天做一个定时任务,在固定时间点进行更新。
就比如,小明在一家大型的互联网公司工作,它将Redis缓存的更新时间设置在一个固定的时间点,比如凌晨3点,这时用户比较少,造成缓存雪崩等其他问题的可能性也比较低。

你可能感兴趣的:(Redis)