面试题答案
一键面试可能导致不一致的原因
- 并发读写问题:在高并发场景下,写操作先更新数据库,还未来得及更新缓存,读操作就从缓存中读取到了旧数据。
- 缓存删除失败:删除缓存操作失败,导致旧数据一直存在于缓存中,而数据库数据已更新。
- 缓存更新策略不当:如采用先更新缓存再更新数据库策略,若更新数据库失败,缓存与数据库数据不一致。
减少或解决不一致的机制设计
- 读写策略调整
- 先更新数据库,再删除缓存:写操作先更新数据库,成功后再删除缓存。读操作时若缓存不存在则从数据库读取并更新缓存。此策略可有效避免并发读写问题,但在高并发下可能出现短暂不一致。
- 读写锁:对关键数据的读写操作加锁,确保同一时间只有一个写操作或读操作,能有效解决并发问题,但性能较低,不适用于高并发场景。
- 缓存失效时间设置
- 合理设置缓存过期时间:对不同数据设置不同的过期时间,重要数据过期时间短,一般数据过期时间长。过期后再次读取时从数据库加载并更新缓存,可减少不一致时间。
- 主动更新缓存:在数据更新时,不仅删除缓存,还可设置一个较短的预过期时间,在预过期时间内主动从数据库加载数据更新缓存,减少用户感知到不一致的可能性。
- 重试机制
- 缓存删除重试:对于缓存删除失败的情况,设置重试机制。可以采用定时重试,或在应用程序中捕获删除失败异常进行重试,直到删除成功,确保缓存及时更新。
- 异步处理
- 使用消息队列:将写操作的缓存更新或删除操作发送到消息队列中,由专门的消费者异步处理。这样可减少写操作的响应时间,同时通过消息队列的重试机制保证缓存操作的最终一致性。
- 双写一致性解决方案
- 引入中间件:如使用Canal组件,通过监听数据库的binlog日志,实时感知数据库的变化,并同步更新缓存,保证缓存与数据库的一致性。