面试题答案
一键面试时间驱动缓存失效策略下合适失效时间间隔的选择
- 考虑商品更新频率
- 对于更新频繁的商品,如限时抢购、价格经常变动的商品,失效时间间隔应设置得较短,例如几分钟甚至几十秒。这样能保证用户获取到相对较新的数据,避免因长时间缓存旧数据而影响用户体验和业务决策。
- 对于更新不频繁的商品,如一些经典款式且库存稳定、价格很少变动的商品,失效时间间隔可以设置得较长,比如几小时甚至一天。较长的失效时间间隔可减少缓存重建带来的性能开销。
- 结合用户访问频率
- 如果某商品访问频率极高,为了降低缓存重建对系统性能的影响,失效时间间隔可适当延长。同时,可以结合缓存预热机制,在失效时间临近时提前异步重建缓存,确保用户获取数据的流畅性。
- 对于访问频率低的商品,失效时间间隔可相对灵活,既能根据更新频率设置,也可适当缩短以释放缓存空间。
- 业务场景与数据敏感度
- 在促销活动等关键业务场景下,对商品数据的准确性要求更高,失效时间间隔应缩短。例如在“双11”等大促期间,商品的价格、库存等信息变化频繁,需要更短的失效时间间隔来保证用户看到准确信息。
- 对于一些对数据敏感度较低的信息,如商品的基本描述等,失效时间间隔可适当延长。
事件驱动策略下确保缓存数据一致性且不影响高并发性能的方法
- 使用消息队列
- 当商品信息更新时,系统将更新消息发送到消息队列(如 Kafka、RabbitMQ 等)。消息队列可以起到削峰填谷的作用,将瞬间的更新请求流量缓冲处理,避免对缓存更新操作造成过大压力。
- 专门的消费者从消息队列中获取更新消息,并根据消息内容更新对应的缓存数据。由于消息队列的异步处理特性,不会阻塞商品详情页的高并发读请求,从而保证系统的高并发性能。
- 缓存标记与延迟更新
- 在商品信息更新时,先在缓存中设置一个标记,表示该商品数据已过时。当有读请求到达时,检查到该标记,先返回缓存中的旧数据,并异步触发缓存更新操作。
- 这种方式能保证读请求的快速响应,不影响高并发性能。同时,通过异步更新机制,在短时间内更新缓存数据,确保数据一致性。
- 采用读写锁
- 对于缓存更新操作,加写锁。在商品信息更新时,获取写锁,更新缓存数据后释放写锁。读请求可以在写锁未被占用时获取读锁进行读取操作。
- 为了提高高并发性能,可以对读锁进行优化,例如采用共享读锁,允许多个读请求同时获取读锁进行读取。但要注意写锁的优先级,以确保缓存数据能及时更新。