# 后端常见缓存问题
业务查询数据时,会先查询缓存,如果缓存中存在该数据则直接返回,如果没有则继续查询数据库,然后返回。并更新缓存。
缓存穿透:缓存穿透是指用户请求的数据在
缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。- 存储这些空数据的 key 进 Redis 中,对应的值设置为null
- 使用布隆过滤器 BloomFilter:缓存之前再加一道屏障,将
数据库中的所有 key都存储在布隆过滤器中,在查询 Redis 前先去布隆过滤器查询key 是否存在,如果不存在就直接返回,不让其访问数据库,从而避免了对底层存储系统的查询压力。
缓存击穿:在高并发情况下,大量请求查询同一个key时,恰好到了缓存过期时间点,导致大量请求发现缓存中该 key 不存在,
直接向数据库发起查询请求导致数据库压力激增。- 第一是否可以考虑热点 key 不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。
- 在查询数据的请求上使用一个
互斥锁,,其他请求查询数据是发现拿不到锁,就进行等待,等待第一个线程查询到数据后,将数据缓存。其他请求再走缓存 - 缓存预热:系统上线后,提前将相关的缓存数据加载到缓存系统
- 缓存降级:直接返回默认数据或访问服务的内存数据。
缓存雪崩:某一时刻发生大规模的缓存失效的情况,如缓存服务宕机,这样就会有大量的请求直接查询数据库,导致数据库压力剧增,甚至引起宕机。
- 采用缓存集群,如redis的使用 主从+哨兵
- 熔断机制:限流降级,当流量达到一定的阈值,直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上将数据库击垮,至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。