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