Redis的缓存穿透,缓存击穿,缓存雪崩

1.缓存穿透

  缓存穿透是指当用户查询一条数据的时候,而此时数据库和缓存内却没有关于这条数据的任何记录,这时他拿不到数据,会一直查询数据库,这样会对数据库的访问造成很大的压力。

  解决方案:
    1.缓存空对象
        缓存空对象就是第一次请求,发现缓存内不存在,数据库内也不存在,将空结果给缓存起来,当第二次访问的时候直接将空值返回出去,但是这样会导致缓存内有大量的空对象,这样不仅会占用许多内存空间,还会浪费很多资源,可以给空对象设置过期时间来解决这个问题
 
 
    2.使用布隆过滤器
      布隆过滤器是一种基于概率的数据结构,主要用于判断当前某个元素是否在该集合中
 
    布隆过滤器特点:
        1.一个非常强大的二进制数组
        2.拥有若干个哈希函数
        3.在空间效率和查询效率都非常高
        4.布隆过滤器不会提供删除方法,在代码维护上比较困难

2.缓存击穿

  缓存击穿是指当这个key在缓存的过期时间时,突然有大量有关这个key的访问请求,这样会导致大量并发请求直接穿透缓存,请求数据库,瞬间对数据库访问压力增大
 
  造成缓存击穿的原因有两个:
      1.一个冷门的key突然被大量用户请求访问。
      2.一个热门key在缓存中恰好过期,这时有大量用户来进行访问
 
  对于缓存击穿最常用的方案是加锁,对于key过期要查询数据的时候加上一把锁,这时只能让第一个请求进行查询数据库,然后把从数据库查询的值放入缓存中。
 

3.缓存雪崩

  缓存雪崩是指在某一时间段内,缓存集中过期失效,如果在这个时间段内有大量请求,而查询量巨大,所有请求都会达到存储层,存储层调用量会暴增,引起数据库压力过大甚至宕机。
 
  引发缓存雪崩的原因:
      1.Redis宕机
      2.大部分数据失效
 
  解决方案:
    1.redis高可用
      多增加几台redis实现,一主多从或多主多从,这样一台挂掉之后其他的还可以继续工作,其实就是搭建redis集群
 
    2.限流降级
      在缓存失效后通过加锁或者队列来控制读数据库写缓存的线程数量,对某个key只允许一个线程查询数据和写缓存,其他线程进行等待
 
    3.数据预热
      就是在正式部署之前,先把数据预先访问一遍这样数据就会加载到缓存中。
 
    4.不同过期时间
      设置不同的过期时间,让缓存失效的时间点尽量均匀。
 
原文链接:
https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247506412&idx=2&sn=27191b8f082aa0bbcdd76e03532e4ad5&chksm=eb505cdadc27d5ccc6fd3db89e15795ef95af2b87b3dee16825c59e4251264a5a309ba773368&scene=126&sessionid=1599555032&key=519b8bbaea533f944777a28cd34c8647e7f535159b4117a0d79ebcbc474f799cab69bee182a0ef2f465b0be8ed0186d898c1d12a26f9276d60c2cd424c9d06f31ca665eea8a9eacc7aa29f1982fb17c4cb4a03d385098c4a09345f2306066ed67c9da892bacd4692db2c99426d7e8102e87f395278374fd4accdcb61eeeb8459&ascene=1&uin=MzM4NTcyMzU4NA%3D%3D&devicetype=Windows+10+x64&version=62090538&lang=zh_CN&exportkey=ASsOv0q2Lnj%2FBcupefzCcrM%3D&pass_ticket=cL0BEjI%2Fvpl4uxIdtSMEBmhxQHs8kTSvskF5zbN8Mv%2BABq8oIwc%2FuHS20VPSMR1t&wx_header=0
 

原文地址:https://www.cnblogs.com/HQ0422/p/13718905.html