面试题答案
一键面试过期时间设置策略
- 分散过期时间:避免大量键设置相同的过期时间,在原本设置的过期时间基础上,增加一个随机的时间偏移量,例如在
[0, 10]
分钟的范围内随机取值,让键的过期时间分散开来,减少同一时刻大量键过期的可能性。 - 使用不同的过期时间范围:根据业务特点,将数据分为不同类别,为每类数据设置不同的过期时间范围。比如热点数据设置较长的过期时间,非热点数据设置相对较短的过期时间。
缓存预热
- 启动时预热:在系统启动阶段,主动查询数据库,将热点数据加载到 Redis 缓存中,并设置合理的过期时间。可以通过批量查询数据库,然后批量写入 Redis 的方式,提高预热效率。
- 定时预热:利用定时任务,在业务低峰期,对即将过期或已经过期的热点数据进行重新加载,确保缓存中始终有热点数据存在,避免在高并发时因缓存过期而直接访问数据库。
系统架构方面的优化
- 增加缓存层冗余:除了 Redis 外,再引入其他缓存,如 Memcached 作为备用缓存。当 Redis 出现大量键过期导致缓存雪崩时,Memcached 可以临时承担部分缓存请求,减轻数据库压力。同时,在代码层面需要做好双缓存的读写逻辑,确保数据一致性。
- 设置熔断与降级:当检测到 Redis 出现大量键过期,系统负载过高时,触发熔断机制,暂时停止部分非核心业务的缓存请求,直接返回兜底数据,保证核心业务的正常运行。对于一些可以降级处理的业务,如推荐系统等,降低其数据实时性要求,使用本地缓存或者简单的默认数据代替从 Redis 获取的数据。
- 数据库优化:对数据库进行优化,提高其处理高并发请求的能力。例如增加数据库连接池大小,优化 SQL 查询语句,使用索引等方式,使数据库在面对缓存雪崩带来的大量请求时,能够尽可能稳定地提供数据服务。
- 使用消息队列:在缓存失效后,将数据库查询请求通过消息队列进行削峰填谷。请求先进入消息队列,系统按照一定的速率从队列中取出请求去查询数据库并更新缓存,避免瞬间大量请求直接压垮数据库。同时,对于已经在消息队列中的请求,可以先从缓存中获取部分数据(如果存在)返回给客户端,提供一定的用户体验。