一.缓存穿透
缓存穿透是指查询数据库中一定不存在的数据,我们正常的操作流程,在查询数据库前,先去查询缓存,如果key不存在或者key过期失效,再去查询数据库,并把查询到的对象放到缓存中,如果查询到的数据为null,不添加缓存。
代码流程
- 查询前先查询缓存,如果查询对象问空,查询数据库,返回对象,存入缓存
- 如果查询对象不为空,返回对象
- 我们缓存的key一般通过主键进行命名,主键是自增唯一的,那么我们试想下,我们传参为-1,缓存中为空,然后查询数据库,数据库也为空,不记录在缓存。那么这样循环下来,就会导致越过缓存一直对数据库进行访问,对数据库造成压力。
- 解决方案:可以通过在查询到的数据为空的时候依然添加缓存,设置缓存时长。
二.缓存雪崩
缓存雪崩可以理解为在某个时间段,缓存集中过期,然后这段时间出现高并发,缓存中查询不到key,所有压力集中在数据库。 缓存集中过期还不是致命的,致命的比如缓存服务节点宕机,这时候对数据库造成的压力是不可预估的。
解决方案:
可以根据数据的热门,冷门进行分类,分类设置缓存时长
三.缓存击穿
缓存击穿的对一个key一直进行高并发持续输出,当这个key在缓存失效的一瞬间,所有并发涌向数据库,一瞬间对数据库进行击穿。
解决方案:对于这种超级爆款的数据就设置永久不过期好了