数据库一致性问题是面试常考的内容。包含MySQL主从一致性,Redis和MySQL的一致性问题,以及Redis集群一致性问题等。如果面试官问道这个问题,还是想更多的考察对一些实际业务的理解吧。至少这一段在找暑期实习的过程中,不乏面试官对一致性的考察。
Redis与MySQL的一致性:
如果问道这个问题,首先要说两者的身份,一个是内存数据库,起到缓存的作用,主要是负责再用户与MySQL提供一个快速的读服务。
即减少向数据库读操作的行为,减少数据库IO操作,提升IO性能。
具体流程:
应用程序需要去读取数据库中的数据时,先去查询缓存,如果命中则直接返回。如果缓存不命中,则会去看MySQL中的数据,然后再把数据填充到Redis当中。
问题:
一份数据同时保存在Redis和MySQL当中,当发生数据更新的时候,会面临不一致的问题。
方案:
1. 先更新数据库再更新缓存
2. 先删除缓存,再更新数据库。
对于方案2来说,分别对redis和MySQL的操作都不是原子的,多线程访问下还是会不一致。
对于方案1来说,由于缓存写入的通常要比数据库写入快很多,不一致状况出现的少。
最终一致性方案:
1. 基于rocketmq的重拾机制
2. canel组件,监听binlog,来即时将MySQL操作更新至Redis当中。
或者加锁,这样会很明显的影响性能。
当前主流的推荐方案:延迟双删,但注意,这个不是强一致性。
延迟双删主要针对【先删除缓存,再更新数据库】方案再【读+写】并发请求而造成缓存不一致时的问题。
对于推荐的实践方案【先更新数据库,再删除缓存】,如何保证两个操作都能执行成功?
删除缓存的时候毕竟是操作的Redis,存在失败的可能性
具体的解决方式有两个:
1. 重试机制
2. 订阅MySQL binlog,再操作缓存
上述两种方式的特点都是异步操作缓存。
参考资料:
【Java面试】大中小厂都会问到的面试题?学到就是提前预约好offer!Redis和Mysql如何保证数据一致性?_哔哩哔哩_bilibili