面试题答案
一键面试缓存雪崩优化思路
- 缓存架构调整
- 设置不同过期时间:避免大量缓存同时过期。对不同类型的商品缓存设置随机的过期时间,比如商品A的缓存过期时间在1 - 2小时内随机,商品B的缓存过期时间在2 - 3小时内随机等。这样可以分散缓存过期的时间点,降低同一时刻大量缓存失效的风险。
- 使用多级缓存:构建二级或多级缓存结构,例如一级缓存使用内存型缓存(如Redis),二级缓存可以使用磁盘型缓存(如Memcached扩展的持久化存储或其他支持持久化的缓存系统)。当一级缓存失效时,先从二级缓存获取数据,如果二级缓存也没有,再去数据库查询,查询后更新一级和二级缓存。
- 主从 + 哨兵或集群:对于Redis等缓存系统,采用主从架构并结合哨兵机制来保证高可用性,防止主节点宕机导致缓存不可用。或者直接使用Redis Cluster集群模式,通过数据分片存储,提高缓存的整体容量和读写性能,即使部分节点出现故障,也不影响整体缓存服务。
- 数据预热策略
- 提前加载:在促销活动开始前,通过脚本或定时任务将热门商品的缓存数据提前加载到缓存中。可以根据过往的销售数据和用户浏览记录,分析出热门商品列表,然后批量将这些商品的信息加载到缓存。
- 预热时间规划:选择在系统低峰期进行数据预热,比如凌晨时段,以减少对正常业务的影响。同时,要确保预热过程中有足够的时间完成所有热门商品的缓存加载。
缓存穿透优化思路
- 缓存架构调整
- 布隆过滤器:在缓存之前加一层布隆过滤器。布隆过滤器可以快速判断一个数据是否存在于集合中。对于电商系统,将所有商品的ID(假设以ID作为查询依据)在系统启动时加载到布隆过滤器中。当有查询请求时,先通过布隆过滤器判断ID是否可能存在,如果不存在,直接返回,不会查询缓存和数据库,大大减少无效查询对数据库的压力。
- 空值缓存:当查询数据库发现某个商品不存在时,将这个空值结果也缓存起来,并设置一个较短的过期时间,比如几分钟。这样后续相同的无效查询就可以直接从缓存中获取空值,而不会穿透到数据库。
- 数据校验策略
- 参数校验:在接收用户请求时,对传入的参数进行严格校验。比如商品ID必须是合法的数字且在合理的范围内,如果参数不合法,直接返回错误提示,不进行后续的缓存和数据库查询。
- 权限校验:对于需要用户登录或特定权限才能访问的商品,在查询缓存和数据库之前,先进行权限校验。只有权限通过的请求才继续处理,防止恶意用户通过非法请求穿透缓存查询数据库。