一:什么是缓存穿透?

  - 定义

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

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

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

  - 问题

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

  - 解决方案

    - 缓存空值

      - 发生穿透的大部分情况,都是因为缓存中没有存储这些空数据的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. 从ServerSwitch到SONiC Chassis:数据中心交换机技术的十年探索历程

    从ServerSwitch到SONiC Chassis:数据中心交换机技术的十年探索历程 2019-07-09 | 作者:白巍   编者按:微软交换机操作系统开源项目SONiC (Software f ...

  2. Java的 「 “ 结构体 ”」 与 「 “ 自定义排序 ” 」

    Java里面的结构体可以靠class来实现,如果相对结构体进行排序,需要写一个接口,class 自定义的名字 implements Comparator<结构体(自己定义的class类的名字)& ...

  3. 10-5使用OpenType字体

    http://www.missyuan.com/viewthread.php?tid=350835&extra=&page=1 现在当我们通过Photoshop.Word或其他应用程序 ...

  4. 异步协程asyncio+aiohttp

    aiohttp中文文档 1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序 ...

  5. matplot 绘制折线图

    #coding=utf-8 import matplotlib.pyplot as pltx_data = ['2011','2012','2013','2014','2015','2016','20 ...

  6. sqlserver数据库查询语句

    --数据库所有表select * from sysobjects where type='u'; --指定表的所有列select name from syscolumns where id=(sele ...

  7. 微信小程序开发步骤简述

    1.登陆微信的开发这平台 2.找到小程序开发选项进入,填写注册自己的小程序信息 3.下载相应的开发者工具 4.通过开发者工具把自己的项目代码上传,上传时会让你填写自己小程序的appid这样项目代码就和 ...

  8. 强大全面的C++框架和库推荐!

    C++ 资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了STL容器,算法和 ...

  9. vue 自定义全局方法

    import {myfun} from '../static/js/test.js' //se6的正确写法export default {methods:{ diyfun:function () { ...

  10. Web前端接入人机识别验证码---腾讯防水墙

    Web前端接入 1. 准备AppID 验证码接入需要先在管理后台中注册获取APPID和APPSECRET,注册步骤请参考 快速开始 2. 快速接入步骤 1.在Head的标签内最后加入以下代码引入验证J ...