面试题答案
一键面试Memcached性能优化及应对缓存问题策略
- 性能优化
- 合理设置缓存过期时间:避免大量缓存同时过期。对于不同商品的抢购缓存,设置有一定时间差的过期时间,如在商品抢购开始前一段时间批量加载缓存,然后为每个缓存项设置在抢购结束后1 - 5分钟内不同的过期时间,防止缓存雪崩。
- 优化数据结构:Memcached以简单的键值对存储,尽量让键值对的数据量保持在合理范围,减少内存碎片。对于复杂商品信息,可先进行序列化处理,确保单个键值对大小不超过Memcached限制(一般1MB左右)。
- 负载均衡:采用一致性哈希算法进行负载均衡,将缓存数据均匀分布在多个Memcached节点上,避免单个节点压力过大。例如使用Twemproxy这样的代理工具实现一致性哈希负载均衡。
- 应对缓存击穿
- 互斥锁:当某个商品的缓存过期,在从数据库加载数据时,使用互斥锁(如基于文件锁机制等)保证同一时间只有一个线程去查询数据库并更新缓存,其他线程等待。一旦缓存更新完成,等待的线程直接从缓存获取数据。
- 热点数据永不过期:对于抢购的热门商品,设置缓存不过期,在商品抢购结束后手动删除缓存。同时,后台启动定时任务,每隔一段时间(如半小时)异步更新缓存中的商品信息。
- 应对缓存雪崩
- 缓存预热:在抢购开始前,预先将所有商品信息加载到缓存中,并设置不同过期时间。可以使用脚本或者定时任务在系统启动时完成这个操作。
- 服务降级:当发生缓存雪崩,部分缓存无法获取时,启用服务降级策略。如对抢购商品提供“稍后重试”提示,避免大量请求直接压到数据库,保证核心业务的可用性。
Redis性能优化及应对缓存问题策略
- 性能优化
- 数据类型选择:根据不同场景选择合适的数据类型。例如对于商品库存可以使用Redis的
INCRBY
原子操作来减少库存,利用Hash
类型存储商品详细信息,以提高存储和查询效率。 - 持久化策略优化:采用混合持久化(AOF + RDB),结合AOF的实时性和RDB的恢复速度优势。在高并发抢购场景下,合理配置AOF重写频率,避免因频繁重写影响性能。
- 集群优化:使用Redis Cluster实现分布式缓存,自动数据分片,提高读写性能和扩展性。通过合理配置节点数量和副本数量,在保证高可用的同时优化性能。
- 数据类型选择:根据不同场景选择合适的数据类型。例如对于商品库存可以使用Redis的
- 应对缓存击穿
- 使用Lua脚本:将查询缓存、判断缓存是否存在、查询数据库和更新缓存的操作封装在一个Lua脚本中,利用Redis的单线程特性,保证原子性操作,避免缓存击穿。
- 设置二级缓存:在应用层设置二级缓存,当Redis中缓存过期,先从二级缓存获取数据(如果存在),同时启动异步线程更新Redis缓存,减少对数据库的直接访问。
- 应对缓存雪崩
- 过期时间随机化:为不同商品的缓存设置随机的过期时间,在抢购开始前一段时间内,将过期时间随机设置在抢购结束后的1 - 10分钟内,避免大量缓存同时过期。
- Redis Sentinel 监控与自动故障转移:部署Redis Sentinel来监控主从节点状态,当主节点出现故障,自动将从节点提升为主节点,保证缓存服务的可用性,防止因某个节点故障引发缓存雪崩。