• 缓存存在的问题:缓存穿透、缓存击穿、缓存雪崩


    🍀缓存穿透

    缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存直接去访问数据库,大量的请求打到DB可能导致DB宕机。

    强调都没有数据+并发访问

    image-20220803150249711

    如果请求一条DB中不存在的数据,此时缓存是不命中的,会请求到DB中,DB查询不到数据因此也不会同步缓存,每次请求都要请求到DB去查询,失去了缓存的意义。在并发访问时,大量请求打到DB,DB可能就会宕机。

    ☘️解决思路

    思路一:由于缓存穿透是因为缓存没有生效,是否可以针对DB不存在的数据设置缓存空值,让请求到缓存就OK。缓存的有效时间可以设置短点,如30s,避免误伤正常业务。

    思路二:采用布隆过滤器 (Bloom Filter) ,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询压力。

    布隆过滤器原理:当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个位数组中的k个点,并将其置为1。当查询时,将元素通过散列函数得到k个点,如果这些点存在不为1的,则被检元素一定不存在,直接返回;如果都是1,则查询元素可能存在,就会查询缓存和DB。

    🍀缓存击穿

    缓存击穿是指数据库有,缓存没有的数据,大量请求访问这个缓存不存在的数据,最后请求打到DB可能导致DB宕机。

    强调单个Key过期+并发访问

    image-20220803152530761

    缓存击穿区别缓存穿透在于,缓存击穿是大量请求同时查询同一个key,而这个key失效了,导致大量请求打到DB,导致DB可能宕机。缓存穿透是请求DB中不存在的数据。

    ☘️解决思路

    思路一:加分布式锁(高并发转低并发),第一个请求的线程拿到锁之后查询DB,并同步缓存,其余线程获取锁失败后会等待一段时间(如50ms),然后重新到缓存中获取数据,将访问DB(慢设备)时高并发转低并发。

    思路二:对于热点数据采用隔离环境,即便热点环境宕机也不会影响到正常环境,一般而言不需要隔离,其成本比较大,只有在大型活动中才可能采用,如618、双11等。

    image-20220803154122598

    思路三:保证热点数据在缓存中,可以设置热点缓存数据永不过期;或者采用定时任务去定时刷新缓存数据与过期时间,保证缓存数据存在。

    🍀缓存雪崩

    缓存雪崩是指数据库有,缓存没有的数据,大量请求访问这些缓存不存在的数据,最后请求打到DB可能导致DB宕机。

    强调批量Key过期+并发访问

    image-20220803154646324

    缓存雪崩在于大量的缓存key失效,大量请求全部打到DB,DB可能会因为瞬时大流量压力而宕机。

    ☘️解决思路

    思路一:由于是设置的key过期时间一样,导致同一时间大量数据失效。我们可以改变缓存失效时间,在原有失效时间上增加一个随机值,最终的目的是让数据分散在不同的时间点过期。

    🍀缓存一致性

    缓存一致性指的是缓存与DB之间的数据一致性,我们需要通过各种手段来防止缓存与DB不一致,我们要保证缓存与DB的数据一致或者数据最终一致。

  • 相关阅读:
    文件的逻辑结构与物理结构的对比与区别
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    ASP.NET CORE 项目搭建(2022 年 3 月版)[一]
    047_第三代软件开发-日志分离
    剑指 Offer 49. 丑数 && 264. 丑数 II ●●
    ip地址范围不是整体范围的子集
    五、 计算机网络(考点篇)
    AI编程案例002/ 根据草图设计小红书封面
    DSP 开发例程: led_flash
    spring session 导致 HttpSessionListener 失效
  • 原文地址:https://blog.csdn.net/Ber_Bai/article/details/126142167