千锋教育2023版Java面试宝典Java面试200题(含美团、字节、阿里大厂真
缓存击穿是指一个非常热门的缓存key在缓存失效的瞬间,再次被请求,此时大量的请求都直接穿过缓存直接请求到了应用服务。这时应用服务可能会因为无法承受高并发的请求而崩溃,从而导致系统整体性能下降。
为了解决缓存击穿问题,常见的解决方案有以下几种:
- 限流降级:通过对缓存请求进行限流或者降级操作,避免因为高并发导致应用服务崩溃。
- 加锁:使用互斥锁或分布式锁等机制,保证在缓存失效和被填充的时间段内,不会有两个进程同时访问到数据库,并且只有一个进程能够重新去加载数据。
- 预加载:提前加载热门key或热点数据,或者使用预热机制,在数据过期之前提前刷新缓存,确保数据的质量和时效性。
- 使用布隆过滤器:使用布隆过滤器对缓存key进行过滤,判断缓存中是否存在该key,有效减少数据库的访问。
- 使用二级缓存:使用二级缓存机制,将热点数据缓存在应用内存中,减少数据库的访问频率,提高访问效率。
缓存穿透如何解决
缓存穿透指查询一个不存在的数据,由于缓存中没有该数据,每次查询都会穿透缓存请求到数据库中,这样会给数据库带来很大的压力。
为了解决缓存穿透问题,常见的解决方案有以下几种:
- 布隆过滤器:使用布隆过滤器可以有效地识别出不存在的数据,从而减轻数据库的负担。如果缓存中存在对应的key,则直接返回结果;如果不存在对应的key,则直接返回缺省值。
- 缓存空对象:缓存空对象可以有效地从源头上解决缓存穿透的问题。如果查询的数据不存在数据库中,则在缓存中先存储一个空对象,这样下次查询缓存的时候就可以直接返回空对象,而不需要每次都进行数据库查询。
- 设置超时时间:缓存中如果长时间无请求则失效,可以设置超时时间,避免缓存中的数据一直存在而不会被更新。
- 前缀和谐:给缓存key设置前缀,可以将查询不存在的key拦截掉,从而避免请求数据库,减轻数据库的压力。
- 限流控制:对请求进行限流控制,可以有效地避免由于高并发而导致的缓存穿透问题。可以使用限流算法,如令牌桶算法、漏桶算法等。
缓存雪崩问题
缓存雪崩
缓存雪崩
缓存雪崩如何解决
缓存雪崩指在同一时间内,缓存中大量的数据失效或者缓存服务器宕机,导致请求直接打到了后端数据库,后端数据库无法承受如此大量的请求,从而导致整个系统崩溃。
为了解决缓存雪崩问题,常见的解决方案有以下几种:
- 数据分布:将数据分布到不同的缓存机器上,避免单一缓存机器失效引起其他机器无法承受高并发的情况。
- 备份机制:设置缓存备份机制,当缓存服务器宕机时,能够自动切换到备份服务器上,避免单点故障导致的系统崩溃。
- 多级缓存:使用多级缓存机制,将缓存分为多个层级,不同层级的缓存时间不同,这样可以有效地避免同时失效导致的雪崩问题。
- 预热机制:在系统启动的时候,对系统中可能出现热点数据进行预热,这样可以在系统运行时减少对后端数据库的查询,减少缓存雪崩的风险。
- 限流降级:在高并发情况下,对请求进行限流或者降级操作,避免由于请求过多,导致系统崩溃,从而保证了系统的可用性。
缓存击穿是指一个非常热门的缓存key在缓存失效的瞬间,再次被请求,此时大量的请求都直接穿过缓存直接请求到了应用服务。这时应用服务可能会因为无法承受高并发的请求而崩溃,从而导致系统整体性能下降。
为了解决缓存击穿问题,常见的解决方案有以下几种:
- 限流降级:通过对缓存请求进行限流或者降级操作,避免因为高并发导致应用服务崩溃。
- 加锁:使用互斥锁或分布式锁等机制,保证在缓存失效和被填充的时间段内,不会有两个进程同时访问到数据库,并且只有一个进程能够重新去加载数据。
- 预加载:提前加载热门key或热点数据,或者使用预热机制,在数据过期之前提前刷新缓存,确保数据的质量和时效性。
- 使用布隆过滤器:使用布隆过滤器对缓存key进行过滤,判断缓存中是否存在该key,有效减少数据库的访问。
- 使用二级缓存:使用二级缓存机制,将热点数据缓存在应用内存中,减少数据库的访问频率,提高访问效率。

