美文网首页
Redis雪崩、击穿、穿透

Redis雪崩、击穿、穿透

作者: 从零开始的程序猿生活 | 来源:发表于2021-02-22 14:25 被阅读0次

    Redis雪崩:指Redis集群出现大面积问题,或者大量key值同时过期,导致大量请求并发的请求数据库,导致数据库崩溃。
    例如:redis中key的过期时间为0点,但是0点有秒杀活动,同时6000个请求访问,原本redis可以挡住5000个请求,但由于redis的key值过期,所以都要请求数据库查询,导致数据库宕机。重启数据库一样会再次大废。
    解决方式:
    1、在设置key值的失效时间时候加个随机值
    2、集群环境的时候可以选择将热点数据放在不同的redis库中。
    3、设置key值为永不失效,数据更新的时候刷新缓存。

    Redis击穿:跟雪崩类似,但指对单独一个key来说。
    例如:redis 的 某一个key值的 过期时间为12点,但是12点的时候遭受恶意攻击等,一下大量并发请求同是获取这个key的值,都要去请求数据库连接,这是就会造成数据库崩溃。
    解决方式:
    1、设置key值为永不失效,数据更新的时候刷新缓存。
    2、使用互斥锁。

    Redis穿透:这种情况指查询的时候数据库中没有这个值,那么这个值也就不会存储在redis中,相当于没有redis集群这一层,那么大量的并发请求袭来,一样会导致数据库崩溃。
    解决方式:
    1、在接口层中增加数据校验,肯定查询不到的数据直接return。
    2、缓存空值,如果查询没值就缓存一个null或"",但是会造成空间浪费,所以可以设置个较短的过期时间,例如60s。
    3、redis中有个高级用法(布隆过滤器),他是一种数据结构,将查询条件存储在布隆过滤器中,如果查询条件有值则查询,没值直接返回。
    布隆过滤器:布隆过滤器是一中数据结构,一个存储二进制(0/1)的列表,通过hash算法计算当前key的hash值,如果计算的hash值为1,那么将列表中索引1位置置为1,如果hash值为7那么将所以为7的位置置为1。查询的时候如果key值通过hasg算法计算后对应列表的位置为1,那么就代表这个key有值。
    缺点:他可以判断某个数据一定不存在,但是没法判断一定存在,因为存在哈希冲突。而且没法删除数据。

    布隆过滤器的另一个作用:推荐去重

    例如新闻客户端的推送去重功能,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。

    实际上,如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行 exists 查询,当系统并发量很高时,数据库是很难扛住压力的。如果使用缓存把历史记录都放入缓存里,占用空间太大明显不现实,这个时候布隆过滤器就登场了,它就是专门用来解决这种去重问题的。它在起到去重的同时,在空间上还能节省 90% 以上,只是稍微有那么点不精确,也就是有一定的误判概率。

    用户浏览记录存入数据库时,会在Filter上通过key的hash算法存储判断其是否存在,类似于数据存在数据库中,判断该数据是否存在的信息即元数据存放在BloomFilter中,避免了每次判断数据是否存在都要去数据库exist一遍;这样推送新闻时通过布隆过滤器判断,推送内容是否已经存在,如果存在则不推送,如果不存在则推送;

    布隆过滤器可以准确过滤你已经看过的内容,没有看过的新内容,可能由于误判率过滤掉极小的一部分,这样就可以保证推荐给用户的都是无重复的。

    相关文章

      网友评论

          本文标题:Redis雪崩、击穿、穿透

          本文链接:https://www.haomeiwen.com/subject/apohfltx.html