面试题答案
一键面试缓存更新策略
- Cache-Aside模式
- 读操作:先从缓存读取数据,若缓存命中则直接返回;若缓存未命中,从数据库读取数据,然后将数据写入缓存,并返回数据。
- 写操作:先更新数据库,然后删除缓存。这样能保证下次读取时,从数据库加载最新数据到缓存。但存在并发问题,比如更新数据库后还未删除缓存时,另一个读请求读取到旧的缓存数据。
- Write-Through模式
- 写操作:同时更新数据库和缓存,保证两者数据一致。优点是数据一致性强,但缺点是性能受数据库写入性能限制,在高并发场景下可能影响系统整体性能。
- Write-Behind模式
- 写操作:只更新缓存,将数据库更新操作异步化。缓存会批量或按一定策略将更新操作同步到数据库。这种方式性能高,但数据一致性相对较弱,在异步同步到数据库之前,数据库和缓存数据可能不一致。
缓存与数据库同步机制
- 双写一致性问题解决
- 使用分布式锁:在更新数据库和删除缓存操作时,获取分布式锁。只有获取到锁的请求才能执行更新和删除操作,避免并发情况下读操作读到旧缓存数据。但加锁会带来性能开销,影响系统并发能力。
- 基于时间戳或版本号:数据库表增加时间戳或版本号字段。写操作时更新该字段,读操作时对比缓存和数据库中的时间戳或版本号。若不一致,从数据库重新加载数据更新缓存。
- 缓存失效处理
- 主动失效:对于一些时效性强的数据,设置合理的缓存过期时间。当缓存过期后,读请求从数据库加载最新数据并更新缓存。
- 被动失效:利用数据库的变更通知机制(如MySQL的binlog、Oracle的logminer等)。当数据库数据发生变化时,通过相应机制通知缓存更新或删除,以保证缓存与数据库数据一致。