zoukankan      html  css  js  c++  java
  • 【11月10日】Redis 缓存系统常见问题及解决方案

    缓存穿透

    缓存穿透就是指当用户在 Redis 缓存系统查询一条数据时,而 MySQL 数据库和 Redis 缓存里却没有关于这条数据的任何记录。这条数据在 Redis 缓存中查询不到自然会向 MySQL 数据库请求获取数据,MySQL 数据库也获取不到数据,导致 Redis 缓存会一直查询 MySQL 数据库,这样会对 MySQL 数据库的访问造成很大的压力

    缓存穿透


    缓存穿透解决方案一: 缓存空对象

    缓存空对象

    缓存空对象是指用户请求查询 Redis 缓存和 MySQL 数据库中不存在的数据时,MySQL 数据库会返回一个空对象,并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

    • 优点

      使用缓存空对象机制原理和实现比较简单(代码维护容易)

    • 缺点

      使用缓存空对象长时间会导致 Redis 缓存中存在大量空对象,不仅会占用许多的内存空间,还会浪费许多资源(推荐设置缓存空对象过期时间)

      redisCache.put(Integer.toString(id),null,60); //过期时间为60s
      

    缓存穿透缓存空对象解决方案


    缓存穿透解决方案二: 布隆过滤器(推荐)

    布隆过滤器

    布隆过滤器是一种过滤器,它的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,会有小小的误判概率,只要参数设置合理,它的精确度可以控制的相对足够精确


    解决方案

    采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层数据库的查询压力

    布隆过滤器在空间效率和查询效率都非常高(不提供删除方法代码维护比较困难)



    缓存击穿

    缓存击穿是指 Redis 缓存中有一些的热点数据 Key 同时过期失效,或有一些非热点数据 Key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis 缓存,涌入 MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃

    缓存击穿


    缓存击穿解决方案一: 永不过期

    永 不 过 期


    缓存击穿解决方案二: 加锁

    加锁

    对于 Redis 缓存中 key 过期时,在 Key 要查询 MySQL 数据库的时候加锁,这时只能让第一个请求进行查询数据库,然后把数据库中查询到的值存储到 Redis 缓存中,对于其他的相同的 Key 查询,可以直接从 Redis 缓存中获取即可

    缓存击穿加锁解决方案



    缓存雪崩

    缓存雪崩是指在某一个时间段内,Redis 缓存突然宕机或大量 Key 集中过期失效,如果这个时间段内有大量请求,而查询数据量巨大,所有的请求都会达到 MySQL 数据库,数据库的访问量会暴增,引起数据库压力过大甚至宕机


    缓存雪崩解决方案

    • Redis 高可用

      搭建 Redis 主从架构或集群架构

    • 限流降级

      在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个 Key 只允许一个线程查询数据和写缓存,其他线程等待

    • 数据预热

      将部分可能大量访问的热点数据提前加载到 Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的 Key

    • 不同的过期时间

      设置不同的过期时间,让缓存失效的时间点尽量均匀

  • 相关阅读:
    自学Python5.2-类和对象概念
    自学Python5.1-面向对象与面向过程
    自学Python2.1-基本数据类型-字符串str(object) 上
    自学Python2.10-跳出循环(break、continue)
    自学Python2.9-循环(while、for)
    自学Python2.8-条件(if、if...else)
    自学Python1.8-python input/print用法 格式化输出
    自学Python1.6-Centos内英文语法切换
    自学Python1.7-python变量以及类型
    自学Python1.5-Centos内python2识别中文
  • 原文地址:https://www.cnblogs.com/tantanli/p/13963776.html
Copyright © 2011-2022 走看看