面试题答案
一键面试保证数据一致性的方法及更新策略
- Cache-Aside(旁路缓存)策略
- 更新操作:先更新数据库,再删除缓存。这样做的原因是,写数据库操作比写缓存操作慢,如果先删除缓存再更新数据库,在这期间如果有读请求,会读到旧数据并重新写入缓存,导致数据不一致。
- 优点:实现简单,大部分场景适用。读请求频率通常高于写请求,所以缓存命中率高。
- 缺点:存在短暂的数据不一致窗口。在更新数据库和删除缓存之间,如果有读请求,会读到旧数据。
- 举例:在一个电商商品信息展示场景中,商品库存数据更新时,先更新MySQL数据库中的库存数量,然后删除Redis中对应的商品缓存。在高并发场景下,如果更新数据库和删除缓存操作间隔时间较短,对数据一致性影响较小,可选用此策略。
- Read - Through(读穿透)策略
- 更新操作:应用程序更新数据库后,由缓存加载器负责从数据库加载最新数据并更新到缓存。缓存加载器可以是应用程序自身的一部分,也可以是一个独立的服务。
- 优点:数据一致性较好,缓存中始终是最新数据。
- 缺点:实现复杂,增加了系统复杂度和维护成本。需要额外的缓存加载器逻辑,并且在高并发写场景下,缓存加载器可能成为性能瓶颈。
- 举例:在一个金融交易系统中,账户余额数据要求较高的一致性。当账户余额更新时,通过读穿透策略,确保缓存中始终是最新的余额数据。在高并发场景下,如果系统对数据一致性要求极高,且对系统复杂度和性能瓶颈有一定的处理能力,可选用此策略。
- Write - Through(写穿透)策略
- 更新操作:应用程序更新数据时,同时更新数据库和缓存。这样能保证数据库和缓存数据实时一致。
- 优点:数据一致性强,不存在数据不一致窗口。
- 缺点:性能较低,因为每次写操作都需要同时操作数据库和缓存,增加了响应时间。写操作频率高时,数据库压力较大。
- 举例:在一个实时统计系统中,如网站的实时访问量统计,需要保证缓存和数据库数据实时一致,可采用写穿透策略。但在高并发场景下,如果写操作频率不高,且对数据一致性要求极高,可选用此策略;若写操作频繁,可能导致数据库性能问题。
- Write - Behind Caching(写后缓存)策略
- 更新操作:应用程序更新数据时,先更新缓存,然后异步批量更新数据库。这样可以提高写操作的响应速度。
- 优点:写性能高,适用于高并发写场景。可以批量处理数据库更新,减少数据库I/O次数。
- 缺点:数据一致性最差,存在数据丢失风险。如果缓存更新成功但异步更新数据库失败,会导致数据不一致。
- 举例:在一个日志记录系统中,对数据一致性要求相对较低,而对写性能要求较高,可采用写后缓存策略。在高并发场景下,如果对数据一致性要求不高,但追求高写性能,可选用此策略。
高并发场景下策略选择
- 对一致性要求较高且读多写少:Cache - Aside策略较为合适,虽然存在短暂不一致窗口,但只要窗口时间足够短,对业务影响不大,同时能保证较高的读性能。例如新闻资讯类应用,文章内容更新频率较低,读操作频繁,使用Cache - Aside策略既能满足一致性要求,又能保证高并发读的性能。
- 对一致性要求极高:Read - Through策略或Write - Through策略可满足需求。如果系统有能力处理增加的复杂度和性能瓶颈,Read - Through策略更优;如果写操作频率较低,Write - Through策略也能适用。例如银行转账系统,对账户余额数据一致性要求极高,可根据系统实际情况选择Read - Through或Write - Through策略。
- 高并发写且对一致性要求相对较低:Write - Behind Caching策略是较好选择,能大幅提高写性能,但需评估数据不一致和数据丢失风险对业务的影响。例如物联网设备数据采集系统,设备数据上报频繁,对数据一致性要求不是非常严格,采用Write - Behind Caching策略可有效提高系统性能。