面试题答案
一键面试1. 互斥锁策略
- 实现方式:在缓存失效时,先获取一个互斥锁(如 Redis 的 SETNX 命令),只有获取到锁的请求才能查询数据库并更新缓存,其他请求等待。获取锁的请求更新完缓存后释放锁,其他等待的请求再次尝试获取锁(此时缓存已更新,一般能直接从缓存获取数据)。
- 优点:实现相对简单,能有效防止大量请求同时访问数据库。
- 缺点:存在锁竞争,可能导致部分请求等待时间过长,降低系统的并发性能。如果获取锁的请求处理时间过长,会影响后续请求的响应时间。
2. 热点数据永不过期策略
- 实现方式:对热点数据不设置过期时间,同时开启一个后台线程,定时去更新这些热点数据的缓存。或者在数据发生变化时主动更新缓存。
- 优点:避免了缓存过期瞬间的大量数据库请求,保证了系统的稳定性和高并发性能。
- 缺点:占用更多的缓存空间,因为热点数据长期占用缓存。而且如果后台更新线程出现问题或者数据更新不及时,可能导致缓存数据与数据库数据不一致的时间较长。
3. 二级缓存策略
- 实现方式:使用两层缓存,第一层缓存设置较短的过期时间,第二层缓存设置较长的过期时间。当第一层缓存失效时,先从第二层缓存获取数据返回给客户端,同时启动异步线程去更新第一层缓存(从数据库获取最新数据)。
- 优点:能在一定程度上减少数据库压力,即使第一层缓存失效,还有第二层缓存兜底,减少直接访问数据库的概率。异步更新第一层缓存也能避免阻塞请求。
- 缺点:增加了缓存的复杂度和维护成本,需要管理两层缓存。如果第二层缓存也失效,还是可能出现缓存击穿问题,只不过概率相对较低。