Redis 击穿、穿透、雪崩的解决方案

Redis 击穿、穿透、雪崩的解决方案

  • 击穿和穿透

    场景: 指的是单个key在缓存中查不到,去数据库查询(透过redis去查db叫击穿) 区别: 击穿:数据在数据库中真实存在,缓存丢失,大量请求击穿数据库 穿透:数据在缓存中没有,数据库中也没有,就好像透过数据找数据一样

    where id = 'xxx' (xxx在redis中不存在 -> 查DB)

    while(true) { where id = UUID; }

  • 雪崩

    查询key并且出现"高并发",缓存中失效或者查不到,然后都去db查询,导致db压力飙升,从而崩溃。

  • 解放方案

    1.当查询数据不存在的时候,给设置一个空值的key进去并设置一个过期时间(最多5分钟)。"比较粗暴"

    2.过滤器: 布隆过滤器:(Bloom Filter),google 的 Gauva 包中有布隆过滤的实现。 核心实现是一个超大的位数组和几个哈希函数。用到哈希就一定会存在哈希碰撞的问题(涉及到哈希算法的问题)。 可以理解为一个不怎么精确的set结构,使用 contains 方法判断某个对象是否存在。 只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。 当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。 缺点: 1.会存在一定的误判率 2.新增加的数据无法进行布隆过滤 3.数据的key不会频繁的更改

    布谷鸟过滤器?
    

    3.加锁排队: 加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。 会导致用户等待超时,这是个治标不治本的方法! 注意:加锁排队的解决方式分布式环境的并发问题,有可能还要解决分布式锁的问题;线程还会被阻塞,用户体验很差!在高并发的环境下很少用

  • 扩展 - 哈希碰撞?(不是很明白)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

\TOC\Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级1、缓存雪崩  发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机  解决办法:    1)随机均匀设置失效

Redis 击穿、穿透、雪崩的解决方案 - HelloWorld