zoukankan      html  css  js  c++  java
  • Redis缓存雪崩、击穿、穿透

    Redis缓存雪崩、击穿、穿透

    缓存:一般缓存都是定时任务去刷新,或者查询不到之后就去更新

    雪崩

    概念

    当缓存服务器重启或者大量缓存数据集中再某一时间段失效(过期),这样在失效的时候,会给后端系统(DB)带来很大的压力,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂

    解决方案

    • 1.过期时间打散:给缓存时间加上一个随机数,避免同一时刻大量数据集中失效
    • 2.热点数据不过期:要着重考虑刷新的时间间隔和数据异常如何处理的情况
    • 3.增加互斥锁:按 key 维度加锁,对于同一个 key,只允许一个线程去计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可

    击穿

    概念

    缓存击穿是指一个key非常热点,不停地扛着高并发,并发集中在这一个点上请求,当这个key过期失效时,持续的高并发就穿透缓存,直接请求DB

    解决方案

    • 1.增加互斥锁:在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存,DB数据回写到缓存,后面的请求就不会打到DB,走缓存,从而避免击穿
    • 2.热点数据不过期:要着重考虑刷新的时间间隔和数据异常如何处理的情况
    • 3.布隆过滤器(Bloom Filter),利用高效的数据结构和算法快速判断出这个Key是否在数据库中存在,不存在就返回,存在你就去查了DB刷新KV再返回

    穿透

    概念

    访问一个缓存和数据库都不存在的 key,此时会直接打到数据库上,并且查不到数据,没法回写缓存,所以每次都会打在数据库上,造成数据库压力过大,甚至崩溃

    解决方案

    • 1.接口校验:可以在最外层先做一层校验:用户鉴权、数据合法性校验
    • 2.缓存空值:当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特性来设置
    • 3.布隆过滤器:使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库
  • 相关阅读:
    destoon手机端mobileurl函数增加城市分类参数
    jCarousel,jQuery下的滚动切换传送插件
    jQuery plugin : bgStretcher 背景图片切换效果插件
    jquery图片切换插件jquery.cycle.js参数详解
    destoon 后台管理左侧新增菜单项
    destoon 列表页面增加手动选择排序方式
    jQuery 淡入淡出有png图的时候 ie8下有黑色边框
    java中Array和ArrayList区别
    趣味理解ADO.NET对象模型
    两个datatable的比较
  • 原文地址:https://www.cnblogs.com/jmtang/p/15022847.html
Copyright © 2011-2022 走看看