redis与数据库一致性
实时同步
适用于对强一致性要求高的情况下。
即首先查询缓存,查询不到再从数据库查询并且保存到缓存;更新时,首先更新数据库,将缓存的设置过期
(建议不要更新缓存,或者清空
因为会导致“缓存穿透”:
查询一个一定不存在的数据时,由于缓存是在不命中时需要从数据库查询,
数据库查询不到就不会写到缓存,这将导致不存在的数据每次请求都要到数据库去查询,
造成缓存穿透。
解决方案:
数据库查询不到,就给Redis缓存一个空值,
再次查询时,先到缓存中判断这个key存不存在,如果不存在,就往数据库查询;
如果存在,再判断该key的value是否为空,如果是,就返回空,如果不是,就返回结果集。
“缓存雪崩”:
缓存中的内容集中在一段时间失效,造成大量缓存穿透,所有的请求压力都落在底层数据库上。
解决方案:
可以分析用户行为,让缓存失效时间均匀分布;
再缓存失效时,可以考虑加锁或者队列来控制读数据库写缓存的线程数量,
这样就避免失效时大量并发都落在底层数据库上。
)
异步队列
适用于对并发程度要求高的情况下,使用kafka等消息中间件来处理
阿里的同步工具Canal
模拟MySQL的Master和Slave同步机制,监控数据库的binary log的日志更新记录来更新缓存
Redis脚本
编写Redis脚本,使用Lua解释器执行
UDF自定义函数
面对MySQL的API编程,使用触发器来进行缓存更新
任务计划