MST
星途 面试题库

面试题:分布式系统中Redis缓存失效与数据一致性深度剖析

在分布式系统架构中,多个节点同时操作Redis缓存,可能会引发复杂的缓存失效和数据一致性问题。假设你负责维护一个大型分布式电商系统,该系统使用Redis作为缓存,当商品库存数据发生变化时,如何确保各个节点的缓存数据与数据库保持一致,且在面对网络分区、节点故障等异常情况时,系统仍能满足一定程度的数据一致性要求,请详细阐述你的设计思路和技术方案。
13.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 缓存更新策略
    • 读写穿透
      • 读操作:应用程序先从Redis缓存中读取商品库存数据。若缓存命中,直接返回数据;若缓存未命中,从数据库读取库存数据,然后将数据写入Redis缓存,并返回给应用程序。
      • 写操作:应用程序更新数据库中商品库存数据后,立即更新Redis缓存中的库存数据。这样可以保证缓存与数据库的数据实时一致。
    • 异步更新(Write - behind Caching)
      • 写操作:应用程序更新数据库中商品库存数据后,将缓存更新操作放入消息队列(如Kafka)。由专门的消费者从消息队列中读取更新任务,异步更新Redis缓存。此方式可提高系统的写性能,但可能存在短暂的数据不一致,需要设置合理的重试机制和缓存过期时间来弥补。
  2. 处理网络分区和节点故障
    • 使用Redis Cluster:采用Redis Cluster的分布式架构,数据会分布在多个节点上,具备自动故障转移功能。当某个节点发生故障时,集群可以自动将该节点的槽(slot)重新分配到其他正常节点,保证系统的可用性。同时,应用程序通过集群客户端连接到Redis Cluster,客户端能够感知节点的变化并自动调整请求的路由。
    • Quorum机制:在更新缓存数据时,采用Quorum机制。例如,假设系统中有N个Redis节点,设定一个Quorum值(如N/2 + 1)。只有当更新操作成功在超过Quorum数量的节点上完成后,才认为更新成功。这样即使部分节点出现网络分区或故障,只要多数节点正常,系统仍能保证数据一致性。
    • 缓存数据版本控制:为每个商品库存数据添加版本号。每次更新数据库库存数据时,同时递增版本号。在读取缓存数据时,不仅读取库存值,还读取版本号。当缓存数据与数据库数据进行一致性校验时,通过比较版本号来判断数据是否一致。若不一致,则从数据库重新加载数据并更新缓存。
  3. 缓存失效处理
    • 设置合理的缓存过期时间:对于商品库存数据,根据业务场景设置适当的缓存过期时间。例如,对于热门商品,设置较短的过期时间(如几分钟),以保证数据的及时性;对于冷门商品,设置较长的过期时间(如几小时或一天)。过期后,下一次读操作会触发读写穿透机制,重新从数据库加载最新数据。
    • 主动失效:当商品库存数据发生重大变化(如库存清零、大量补货等)时,除了更新缓存数据,还可以主动使相关的缓存数据失效。可以通过发布 - 订阅模式,当数据库库存数据更新时,发布一条消息通知所有节点清除对应的缓存数据。然后,节点在下次读取该商品库存数据时,通过读写穿透机制获取最新数据。