zoukankan      html  css  js  c++  java
  • 缓存

    缓存穿透

    顾名思义:就像是【永远越过了缓存而直接访问数据库】。如果缓存中数据不存在,则查询数据库。如果每次都访问不存在的数据,则每次都访问数据库。 如果恶意查询不存在的数据,则极有可能压垮数据库,这个过程称为缓存穿透

    业界通用的解决方案
    当查询数据库时如果没有查询到数据,则将Null返回给前端用户,同时将Null数据写入缓存,并对对应的key设置一定的过期时间,流程结束。
    这种方案一定程度上可以减轻数据库被频繁查询的压力。

    缓存雪崩

    在某个时间点,缓存中的Key集体过期失效,导致大量查询数据的请求都落在了数据库上,导致数据库负载过高,压力暴增,甚至有可能压垮数据库。

    解决方案
    这种问题产生的原因主要时大量的Key在某个时间点或者某个时间段过期失效,所以为了更好的避免这种情况的发生,一般的做法时为这些key设置不同的/随机的TTL,从而错开缓存中Key的失效时间,可以在某种程度上减轻数据库的查询压力。

    缓存击穿

    指的是缓存中某个频繁被访问的Key(热点Key),在不停的扛着前端的高并发请求,当这个key突然在某个瞬间过期失效,持续的高并发访问请求就穿破缓存,直接访问数据库,导致数据库压力在一瞬间暴增。

    解决方案
    这种现象就像是【在一张薄纸上戳了一个洞】。这种问题产生的主要原因是热点key过期失效了。在实际情况下,既然这个key可以被当作热点数据频繁访问,那么就应该设置这个key永不过期,这样前端的高并发请求将几乎永远不会落在数据库上。

    总结
    不管是缓存穿透/缓存雪崩/缓存击穿,其实他们最终导致的后果是一致的。即给数据库造成压力,甚至压垮数据库。他们的解决方案有一个共性,那就是加强防线,尽量让高并发请求落在缓存中,避免他们直接跟数据库打交道。

  • 相关阅读:
    济南学习D1T5__HEAP
    快速计算C(n,r)
    快速阶乘算法
    济南学习D2T1__折纸带
    济南学习D3T1__线性筛和阶乘质因数分解
    栈与队列:栈的链式储存结构
    线性表应用:建立一个随机数 链表获得中间结点
    栈与队列应用:二进制转十进制 八进制 十六进制(栈)
    线性表:单链表基本操作代码
    线性表应用:魔术师发牌与拉丁(Latin)方阵(循环链表)
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/13620634.html
Copyright © 2011-2022 走看看