【Redis】缓存穿透、缓存击穿、缓存雪崩产生原因及解决方案

一. 本文对Redis中[缓存穿透]、[缓存击穿]、[缓存雪崩]三种现象产生原因、解决方法进行说明

二. 缓存穿透

1. 原因

缓存不存在或已过期,请求直接打到数据库层

2. 解决方法

  1. 缓存永不失效
  2. 通过设置无过期时间的缓存
  3. 定时任务或异步线程定期更新缓存
  4. 发现缓存即将过期时延长过期时间(过期时间放在缓存中)
  1. 利用互斥锁保证同一时刻只有一个请求可以穿过不存在的缓存直接查数据库,其它请求阻塞,直到拿到锁,再从缓存中获取数据。但使用互斥锁会导致系统吞吐量下降
static Object lockObj = new Object();

synchronized (lockObj) {

    value = redis.get(key);
    if (StringUtils.isNotBlank(value)) {

        return value;
    }

    redis.set(key, value, time);

    return value;
}

三. 缓存击穿

1. 原因

缓存不存在或已过期,数据库也不存在数据

2. 解决方法

  1. 数据库不存在数据时,使用一个默认值回写缓存
  2. 布隆过滤器
  3. 互斥锁

四. 缓存雪崩

1. 原因

同一时刻大量缓存失效

2. 解决方法

  1. 缓存的过期时间尽量均匀分布,避免同时失效
  2. 热点缓存永不过期
  3. 互斥锁

五. 公共解决方法

1. 限流:检测到接口延时较大或异常较多时,进行限流

2. 熔断:检测到接口延时较大或异常较多时,使用降级数据返回或提示用户稍后再试

3. 多级缓存:应将流量尽量分流或过滤,比如从网关、CDN、反向代理层等读取缓存直接返回

Original: https://www.cnblogs.com/gossip/p/14791227.html
Author: 扯
Title: 【Redis】缓存穿透、缓存击穿、缓存雪崩产生原因及解决方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528890/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Daydream Controller手柄数据的解析

    参考: How I hacked Google Daydream controller How I hacked Google Daydream controller (Part …

    Linux 2023年6月7日
    093
  • 排序算法

    内部排序 这里先介绍一个概念,算法稳定性 算法稳定性 — 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]…

    Linux 2023年6月6日
    0137
  • Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    在linux下一般用scp这个命令来通过ssh传输文件。 1、从服务器上下载文件 scp username@servername:/path/filename /var/www/l…

    Linux 2023年6月13日
    0118
  • Oracle中row_number()、rank()、dense_rank() 的区别

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行…

    Linux 2023年6月14日
    0101
  • 【证券从业】金融基础知识-第三章 证券市场主体01

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为三篇文章记录消化 posted @2022-06-01 22:20 陈景中 阅读…

    Linux 2023年6月13日
    0125
  • JCL 日志门面

    JCL( Jakarta Commons Logging ),是 Apache 提供的一个 通用日志 API 。用户可以自由选择第三方的日志组件作为具体实现,像 Log4j 或 J…

    Linux 2023年6月8日
    092
  • 【总结】瞬时高并发(秒杀/活动)Redis方案

    1,Redis 丰富的数据结构(Data Structures) * 字符串(String) – Redis字符串能包含 任意类型的数据 一个字符串类型的值最多能存储 …

    Linux 2023年5月28日
    090
  • 轻量级多级菜单控制框架程序(C语言)

    1、前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计;很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网…

    Linux 2023年6月7日
    0120
  • JavaScript 设计模式

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo…

    Linux 2023年6月13日
    0121
  • 在.NET中体验GraphQL

    前言 以前需要提供Web服务接口的时候,除了标准的WEBAPI形式,还考虑了OData、GraphQL等形式,虽然实现思路上有很大的区别,但对使用方来说,都是将查询的主动权让渡给了…

    Linux 2023年6月6日
    0136
  • Netty源码解读(四)-读写数据

    读写Channel(READ)的创建和注册 在NioEventLoop#run中提到,当有IO事件时,会调用 processSelectedKeys方法来处理。 当客户端连接服务端…

    Linux 2023年6月7日
    096
  • qsort的cmp函数理解

    近期频繁使用qsort函数,但是对于cmp函数却一直不太熟悉,现用现查。故写一篇小笔记记录一下。 函数原型: void qsort(void *base,size_t NumEle…

    Linux 2023年6月8日
    080
  • QT官方社区及版本说明

    Qt版本说明 版本分类 Qt商业版:提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。 Qt开源版:提供了和商业版本同样的功能。它是免费…

    Linux 2023年6月13日
    0174
  • 三少玩Linux之LinuxMint, win7共存安装与简单配置

    先安装win7, 这里就不说了;再安装Mint, 这个是视频:https://www.bilibili.com/video/BV1AE411P7Cz; 这里关键就是LinuxMin…

    Linux 2023年6月14日
    0117
  • [编译] 8、在Linux下搭建 stm8 单片机的开发烧写环境(makefile版)

    一、SDCC(Small Device C Compiler)编译环境搭建 1.1、下载 1.2、编译 1.3、测试 二、Hex2Bin+命令行烧写工具配置使用 2.1、下载工具安…

    Linux 2023年6月8日
    0130
  • MTSP问题的简单介绍

    1. TSP问题与MTSP问题 1.1 TSP与MTSP问题的介绍: TSP:是指旅行家(1名)要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的 路程最短…

    Linux 2023年6月14日
    0162
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球