一:什么是缓存穿透?

  - 定义

    - 正常情况下,我们在理想的条件下去查询缓存数据都是存在的。

    - 那么请求去查询一条数据库中不存在的数据,也就是缓存和数据库都查询不到这条数据。

    - 所以请求每次都会打到数据库上面去,这种查询不存在数据的现象我们称为缓存穿透。

  - 问题

    - 在大量的恶意请求会直接打到数据库上,会造成数据库的压力过大。影响正常业务,同时可能造成数据库宕机。

  - 解决方案

    - 缓存空值

      - 发生穿透的大部分情况,都是因为缓存中没有存储这些空数据的key。从而导致每次查询数据库。

      - name我们就可以把这些对应的空值缓存,在查询,则直接返回缓存的null。

      - 设置空值时候不要忘记设置过期时间。

    - BloomFilter(布隆过滤器)

      - 详细请看 《算法 - 布隆过滤器》

      - 由于布隆过滤器的特性,适合去重或者过滤不经常删除的数据。

      - 也可以当数据量大时,作为前置过滤器使用。

    - 方案选择

      - 在对于穿透的方案选择中,更应该对穿透的键做进一步的分析。

      - 针对于一些恶意攻击,攻击带过来的大量key 是不存在的

        - 那么我们采用第一种方案就不太合适,因为会缓存大量不存在key的数据。

        - 针对这种key异常多、请求重复率比较低的数据,我们就没有必要进行缓存,使用第二种方案直接过滤掉。

      - 而对于空数据的key有限的,重复率比较高的,我们则可以采用第一种方式进行缓存。

二:什么是缓存击穿?

  - 定义

    - 在业务场景中,大量的请求同时查询一个 key 时,而这个key此时刚好失效。

    - 就会导致大量的请求都(击穿)打到数据库上面去。

    - 这种现象我们称为缓存击穿。

  - 问题

    - 在瞬间大量的查询会直接打到数据库上,会造成数据库的压力过大。影响正常业务,同时可能造成数据库宕机。

  - 解决方案

    - 定期刷新 Redis 过期时间

      - 定期监控键的过期时间,在将要过期的 key 重刷 ,使得 key缓存一直存在。

    - 锁

      - 在key失效导致需要去查询数据库时,对第一个查询加 互斥锁,其余查询等待锁释放。

      - 在做完缓存后,释放锁资源。

      - 缺点是在做缓存的时候,导致等待。

三:缓存雪崩

  - 定义

    - 某时刻发生大规模缓存失效,会有大量的请求访问DB,导致数据库宕机。

  - 缓存雪崩的解决方案

    - 事前 (为防止缓存雪崩)

      -  Redis,可以使用 主从+哨兵 ,Redis Cluster 来避免 Redis 全盘崩溃的情况。

      - 尽量保证服务的高可用

    - 事中 (避免大规模访问DB)

      - 启动自身的限流&降级处理方法, 避免MySQL被打死.

    - 事后 (尽快的恢复缓存服务)

      - Redis持久化机制,尽快恢复缓存集群

    - 偷图

      - 

四:热点数据集中失效问题

  - 定义

    - 在设置缓存的时候,一般会给缓存设置一个失效时间,对于一些热点的数据来说,当缓存失效以后会存在大量的请求过来,然后打到数据库去,从而可能导致数据库崩溃的情况。

  

  - 解决方案

    - 设置不同的失效时间

      - 为了避免这些热点的数据集中失效,那么我们在设置缓存过期时间的时候,我们让他们失效的时间错开。

      - 比如在一个基础的时间上加上或者减去一个范围内的随机值。

    - 互斥锁

      - 结合上面的击穿的情况,在第一个请求去查询数据库的时候对他加一个互斥锁,其余的查询请求都会被阻塞住,直到锁被释放,从而保护数据库。

      - 但是也是由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。

 

《Redis - 穿透/击穿/雪崩/集中失效》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. mysql IFNULL函数和COALESCE函数使用技巧

    IFNULL() 函数      IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值. IFNULL() 函数 ...

  2. [bzoj 4887] [Tjoi2017]可乐

    传送门 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市 ...

  3. [线性代数] 矩阵代数進階:矩阵分解 Matrix factorization

    Matrix factorization 导语:承载上集的矩阵代数入门,今天来聊聊进阶版,矩阵分解.其他集数可在[线性代数]标籤文章找到.有空再弄目录什麽的. Matrix factorization ...

  4. zabbix (二)安装

    一.centos7源码安装zabbix3.x 1.安装前环境搭建 下载最新的yum源 #wget -P /etc/yum.repos.d http://mirrors.aliyun.com/repo/ ...

  5. SDK/JDK,Shell/Shell脚本,Apache/APR ,MTK

    SDK 软件开发工具包(SoftwareDevelopmentKit) API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用 ...

  6. 在 Java 应用程序中加一些 Groovy 进来

    如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...

  7. SQL-W3School-函数:SQL COUNT() 函数

    ylbtech-SQL-W3School-函数:SQL COUNT() 函数 1.返回顶部 1. COUNT() 函数返回匹配指定条件的行数. SQL COUNT() 语法 SQL COUNT(col ...

  8. Kibana的安装与配置

    Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...

  9. 采购信息记录批导BAPI

    转自:https://www.cnblogs.com/freeandeasy/p/11810272.html作者的话:   可以批导创建及修改信息记录的主数据.而且可以对条件中的时间段及其数量等级中的 ...

  10. C++: Unresolved external symbol __imp__fscanf

    VS2019中遇到错误error LNK2001: unresolved external symbol __imp__fscanf 解决办法:链接legacy_stdio_definitions.l ...