面试题答案
一键面试缓存一致性方案设计
- 读写策略
- 读操作:先从缓存读取数据,如果缓存命中则直接返回;若缓存未命中,再从数据库读取,读取后将数据写入缓存,并设置合理的过期时间。
- 写操作:采用“先更新数据库,再删除缓存”策略。更新数据库成功后,立即删除对应的缓存数据。虽然有短暂的数据不一致窗口,但在高并发电商场景下,相对“先删除缓存,再更新数据库”策略,能减少因缓存删除失败但数据库更新成功导致的数据不一致问题。同时,为了尽量缩短不一致窗口,可以为缓存设置较短的过期时间,促使数据尽快从数据库重新加载到缓存。
- 使用分布式缓存同步机制:如使用 Redis 的发布 - 订阅(Pub - Sub)功能。当某个节点更新了数据库并删除本地缓存后,通过发布消息告知其他节点也删除相应缓存,确保各节点缓存一致性。
应对缓存雪崩
- 设置不同过期时间:避免大量缓存数据在同一时间过期。对商品数据的缓存设置随机的过期时间,例如在原本设定的过期时间基础上,上下浮动一定的时间范围(如 1 - 10 分钟)。
- 使用二级缓存:主缓存失效时,从二级缓存读取数据。二级缓存可以采用与主缓存不同的存储介质或策略,如使用本地内存缓存作为二级缓存,在主缓存(如 Redis)失效时,先从本地内存缓存获取数据,然后尽快从数据库加载数据到主缓存和二级缓存。
- 缓存预热:在系统上线前,提前将热点商品数据加载到缓存中,并设置合理的过期时间,避免上线后大量请求同时查询数据库导致雪崩。
应对缓存穿透
- 布隆过滤器:在查询数据前,先通过布隆过滤器判断数据是否存在。布隆过滤器可以快速判断一个数据一定不存在或者可能存在,对于一定不存在的数据直接返回,避免查询数据库。如果布隆过滤器判断可能存在,再去查询缓存和数据库。当数据库中新增数据时,同步更新布隆过滤器。
- 空值缓存:当查询数据库发现数据不存在时,也将该空值缓存起来,并设置较短的过期时间。后续相同查询直接从缓存返回空值,避免重复查询数据库。