面试题答案
一键面试-
缓存更新策略
- 先更新数据库,再更新缓存:
- 步骤:在更新数据场景下,应用程序首先向数据库发起更新操作,当数据库更新成功后,再去更新缓存中的数据。
- 优点:逻辑相对简单,容易理解和实现。
- 缺点:如果在更新数据库成功后,更新缓存失败,可能会导致数据库与缓存数据不一致。同时在高并发场景下,可能存在缓存更新的竞争问题,导致部分缓存更新丢失。
- 先删除缓存,再更新数据库:
- 步骤:应用程序先删除缓存中的数据,然后进行数据库的更新操作。
- 优点:在一定程度上避免了先更新数据库再更新缓存时,缓存更新失败导致的数据不一致问题。因为后续请求该数据时,缓存缺失,会从数据库中加载最新数据并重新写入缓存。
- 缺点:在高并发场景下,如果在删除缓存后,数据库更新完成前,有大量读请求进来,会导致大量请求穿透到数据库,增加数据库压力。而且如果删除缓存失败,也会出现问题。
- 先更新数据库,再删除缓存:
- 步骤:应用程序先对数据库进行更新操作,更新成功后,再删除缓存中的数据。
- 优点:这种方式结合了前两种的部分优点,相对较为常用。因为缓存中的数据被删除后,后续请求会重新从数据库加载并写入缓存,保证了数据的一致性。并且相比先删除缓存再更新数据库,减少了数据库在更新过程中的读压力。
- 缺点:同样存在删除缓存失败的风险,此时需要有重试机制或者补偿机制。另外,在高并发场景下,也可能存在短暂的数据不一致窗口,比如在更新数据库和删除缓存之间,有读请求进来,读到的还是旧数据。可以通过设置缓存过期时间等方式来降低影响。
- 先更新数据库,再更新缓存:
-
搜索引擎同步策略
- 使用数据库的 binlog:
- 步骤:数据库通常会记录二进制日志(binlog),记录所有数据库的更改操作。可以通过解析 binlog 来捕获数据的更新,然后将这些更新操作同步到搜索引擎中。例如,使用 Canal 等工具模拟 MySQL 从库,通过解析 binlog 来获取数据变更,再将变更数据发送到搜索引擎。
- 优点:这种方式对应用程序侵入性较小,不需要在应用程序中额外编写过多同步搜索引擎的代码。并且能够保证数据的一致性,因为是基于数据库的真实变更记录。
- 缺点:需要额外部署和维护 binlog 解析相关的组件,增加了系统的复杂性。同时 binlog 解析和同步可能存在一定的延迟。
- 在应用层同步:
- 步骤:在应用程序更新数据库成功后,直接调用搜索引擎的 API 进行数据的更新操作。
- 优点:实现相对简单直接,能够及时同步数据到搜索引擎。
- 缺点:对应用程序侵入性较大,耦合度较高。而且如果在更新数据库和更新搜索引擎之间出现异常,可能导致数据不一致,需要有完善的异常处理和重试机制。
- 使用数据库的 binlog:
-
减少性能影响的措施
- 批量操作:无论是更新缓存还是同步数据到搜索引擎,尽量采用批量操作的方式。例如,将多个数据更新操作合并成一次批量请求,减少网络交互次数,提高系统性能。
- 异步处理:对于缓存更新和搜索引擎同步操作,可以采用异步方式。比如使用消息队列(如 Kafka、RabbitMQ 等),将数据更新消息发送到消息队列中,然后由专门的消费者异步处理这些消息,进行缓存更新和搜索引擎同步。这样可以避免同步操作阻塞应用程序的主线程,提高系统的响应性能。
- 设置合理的缓存过期时间:对于一些允许短暂不一致的数据,可以设置较短的缓存过期时间,这样即使在更新数据时出现短暂的不一致,也能在过期后自动恢复一致,同时减少因缓存不一致导致的问题。
- 缓存预热:在系统启动或者数据发生大规模更新后,可以提前对一些热点数据进行缓存预热,避免大量请求直接穿透到数据库,减少数据库压力,提高系统性能。