深入理解缓存穿透、缓存击穿和缓存雪崩

news2024/12/28 17:55:29

在现代分布式系统中,缓存是提升系统性能和减轻数据库负载的重要组件。然而,在实际应用中,我们可能会遇到一些缓存问题,如缓存穿透、缓存击穿和缓存雪崩。本文将详细探讨这三种缓存问题的原理、影响以及解决方案。

一,缓存穿透

1. 原理

缓存穿透是指缓存和数据库中都不存在的数据被频繁请求,导致每次请求都要到数据库去查询,从而失去了缓存的意义。这通常是由于恶意攻击或程序错误引起的。
在这里插入图片描述

2. 影响

缓存穿透会直接导致数据库压力增大,严重时可能导致数据库崩溃。

3. 解决方案

  • 布隆过滤器(Bloom Filter): 在缓存之前增加一个布隆过滤器,用于快速判断请求的数据是否存在。如果布隆过滤器判断数据不存在,则直接返回,而不访问数据库。
  • 缓存空结果: 对于查询结果为空的数据,可以将空结果也缓存起来,并设置一个较短的过期时间,防止同一请求频繁访问数据库。
  • 非法值校验: 对于一些请求参数,我们是能够判断出是否合法,如果不合法直接在入口处拦截,自然不需要穿透到 DB。

4. 示例代码

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class CacheService {
    private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(), 100000);

    public String getData(String key) {
        if (!bloomFilter.mightContain(key)) {
            return null; // 数据不存在
        }
        String value = redis.get(key);
        if (value == null) {
            value = database.get(key);
            if (value != null) {
                redis.set(key, value);
            } else {
                redis.set(key, "null", 60); // 缓存空结果
            }
        }
        return value;
    }
}

二, 缓存击穿

1. 原理

缓存击穿是指某些热点数据在缓存过期的瞬间,有大量请求同时到达,导致这些请求直接访问数据库,造成数据库压力骤增。

2. 影响

缓存击穿会导致数据库在短时间内承受大量请求,可能会引发数据库性能问题。

3. 解决方案

  • 互斥锁(Mutex): 在缓存失效时,使用互斥锁来控制只有一个线程能访问数据库,其他线程等待缓存更新完成。
  • 提前更新缓存: 设置热点数据的缓存不过期,或者在缓存即将过期时主动更新缓存。

4. 示例代码


import java.util.concurrent.locks.ReentrantLock;

public class CacheService {
    private ReentrantLock lock = new ReentrantLock();

    public String getData(String key) {
        String value = redis.get(key);
        if (value == null) {
            lock.lock();
            try {
                value = redis.get(key);
                if (value == null) {
                    value = database.get(key);
                    if (value != null) {
                        redis.set(key, value);
                    }
                }
            } finally {
                lock.unlock();
            }
        }
        return value;
    }
}

三,缓存雪崩

1. 原理

缓存雪崩是指在某一个时间段内,大量缓存同时失效,导致大量请求直接访问数据库,造成数据库压力骤增。
在这里插入图片描述

2. 影响

缓存雪崩会导致数据库在短时间内承受巨大的压力,可能会引发系统崩溃。

3. 解决方案

  • 缓存过期时间分散: 设置缓存时,使用随机的过期时间,避免大量缓存同时失效。
  • 双缓存策略: (Redis 高可用)使用主缓存和备份缓存,当主缓存失效时,从备份缓存中读取数据。
  • 限流降级: 在缓存失效时,对请求进行限流或降级处理,防止数据库被压垮。
  • 数据库解耦: 应用完全与数据库解耦,只读 Redis,由专门的 job 应用主动填充缓存。

4. 示例代码

import java.util.Random;

public class CacheService {
    private Random random = new Random();

    public void setData(String key, String value) {
        int expireTime = 3600 + random.nextInt(600); // 随机过期时间
        redis.set(key, value, expireTime);
    }

    public String getData(String key) {
        String value = redis.get(key);
        if (value == null) {
            value = database.get(key);
            if (value != null) {
                setData(key, value);
            }
        }
        return value;
    }
}

四,总结

缓存穿透、缓存击穿和缓存雪崩是缓存系统中常见的问题。通过合理使用布隆过滤器、互斥锁、随机过期时间等技术手段,可以有效地解决这些问题,提升系统的稳定性和性能。在实际应用中,开发者应根据具体场景选择合适的解决方案,确保缓存系统的高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣&#xff1f;搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频&#xff0c;还是搞怪的段子&#xff0c;合适的配音都能让内容增色不少。 今天&#xff0c;就让我们来探索六个文字配音软件&#xff0c;它们不仅能帮你实现搞笑配音&…

APK 获取 SHA1 值

1&#xff1a;将对应的包体放置在指定目录下 2&#xff1a;在此路径打开cmd命令窗口 3&#xff1a;输入以下命令 keytool -list -printcert -jarfile 1.apk(此处为你需要查看的apk名称)4&#xff1a;得到这个包体的相关信息 能查看到这个包体相关的所有签名和一些扩展的参数 …

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求&#xff0c;有的非常简单&#xff0c;基本链接的形式就可以。 有的就比较复杂&#xff0c;涉及跨域…

简易登录注册;测试类;postman测试;

项目是如何创建的&#xff0c;最简易的登陆注册功能是怎么实现的&#xff0c;数据库不能明文存放密码&#xff0c;密码经过了怎么样的处理存入数据库 前端使用nodejs18 后端项目需要等待maven加载完相关依赖&#xff0c;后端使用java17 1后端 1.1 创建项目所需要的数据库 内…

安宝特方案 | AR技术在轨交行业的应用优势

随着轨道交通行业不断向智能化和数字化转型&#xff0c;传统巡检方式的局限性日益凸显。而安宝特AR眼镜以其独特的佩戴方式和轻便设计&#xff0c;为轨道交通巡检领域注入了创新活力&#xff0c;提供了全新的解决方案。 01 多样化佩戴方法&#xff0c;完美适应户外环境 安宝特…

骨传导耳机哪个牌子最好?五大爆品骨传导耳机全维度拆解推荐!

随着科技的不断进步&#xff0c;消费者对电子产品的需求也在日益增长&#xff0c;特别是在音频领域&#xff0c;骨传导耳机作为一项革新性的技术&#xff0c;正逐渐成为市场的新宠。不同于传统的空气传导耳机&#xff0c;骨传导耳机通过振动颅骨直接将声音传递至内耳&#xff0…

vivo全新AI战略“蓝心智能”发布 原系统5亮相开发者大会

​10月10日&#xff0c;2024 vivo开发者大会在深圳国际会展中心举办&#xff0c;大会主题为“同心同行”。会上&#xff0c;vivo正式发布全新AI战略——“蓝心智能”&#xff0c;同时带来全面升级的自研蓝心大模型矩阵、原系统5&#xff08;OriginOS 5&#xff09;、蓝河操作系…

开发环境搭建之JAVA多个JDK版本安装

由于项目需要安装多个版本JDK、所以在此记录一下安装过程&#xff1a; 下载JDK1.8 11 17 等多个版本 简单粗暴一看就会、直接从官网下载exe安装包、然后配置环境变量即可 JDK1.8 JDK11 JDK17 安装完成之后如下图&#xff1a; 环境变量配置 右击“我的电脑”属性、找到…

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求&#xff1a; 1. 组建对等网络&#xff0c;会在命令行使用ipconfig&#xff0c;两网络能够相互ping通&#xff0c;尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer&#xff0c;模拟组建对等网并测试对等网 1、组建对等网络 连…

RandLA-Net PB 模型 测试

tensorflow ckpt 模型 转换 pb 模型, 测试模型是否正确, 后续实现 c++ 部署。 Code: https://github.com/QingyongHu/RandLA-Net 测试PB 模型 RandLANetConvert.py import tensorflow.compat.v1 as tf tf.disable_v2_behavior

第十三章 Redis短信登录实战(基于Redis)

目录 一、概述 1.1. Session复制 1.2. 使用Redis 二、基于Redis实现共享Session登录 2.1. 实现思路 2.2. 功能实现的主要代码 2.2.1. 用户业务接口 2.2.2. 用户业务接口实现类 2.2.3. 用户控制层 2.2.4. 登录拦截器 2.2.5. 拦截器配置类 2.3. 优化登录拦截器 完…

JVM系列(一) -浅谈虚拟机的成长史

一、摘要 众所周知&#xff0c;Java 经过多年的发展&#xff0c;已经从一门单纯的计算机编程语言&#xff0c;发展成了一套成熟的软件解决方案。从互联网到企业平台&#xff0c;Java 是目前使用最广泛的编程语言。 以下这段内容是来自 Java 的官方介绍&#xff01; 从笔记本电…

程序设计基础I-实验7 函数(函数题)

6-1 sdut-C语言实验-计算组合数 计算组合数。C(n,m),表示从n个数中选择m个的组合数。 计算公式如下&#xff1a; 若&#xff1a;m0&#xff0c;C(n,m)1 否则&#xff0c; 若 n1&#xff0c;C(n,m)1 否则&#xff0c;若mn&#xff0c;C(n,m)1 否则 C(n,m) C(n-1,m-1) C(n-1,m…

linux下新增加一块sata硬盘并使用

1&#xff09;确认新硬盘能被正确识别到 2&#xff09;对新硬盘进行分区 说明&#xff1a;fdisk指令中输入“m”&#xff0c;可以看到详细的指令含义。 3&#xff09;确认新创建的分区 5&#xff09;格式化新创建的分区 6&#xff09;挂载新分区并使用

网优学习干货:王者荣耀游戏用户体验洞察及质差识别(2)

王者荣耀卡顿特点 影响时延的因素 手游定界定位解决方案 基于“9段法”进行卡顿问题分解 通过数据关联->体验定标->优化提升&#xff0c;改善手游卡顿 无线侧通过“面”和“点”优化改善空口时延 参数及互操作策略优化提升业务感知 传输优化准确定位管道问题——无TWAM…

kafka快速入门系统学习示例

1.主要名词 Broker&#xff1a;消息中间件处理节点&#xff0c;⼀个Kafka节点就是⼀个broker&#xff0c;⼀个或者多个 Broker可以组成⼀个Kafka集群。 partition&#xff1a;通过partition将⼀个topic中的消息分区来存储。这样的好处有多个&#xff1a;分区存储&#xff0…

ArgoWorkflow教程(六)---无缝实现步骤间参数传递

之前我们分析了&#xff0c;Workflow、WorkflowTemplate 、template 3 者之间如何传递参数。 本文主要分析同一个 Workflow 中的不同 step 之间实现参数传递&#xff0c;比如将上一个步骤的输出作为下一个步骤的结果进行使用&#xff08;而非以文件方式传递&#xff09;。 1. …

引领零售未来:年销售额500亿的运动品牌如何实现多渠道会员管理?

通过技术创新和全渠道整合&#xff0c;提升运动品牌影响力、用户粘性和市场竞争力。 运动热情高涨持续释放消费潜力&#xff0c;全球知名运动品牌2024财年营收超500亿美元&#xff0c;保持七个季度连续增长。 而随着电商的崛起和消费习惯的变化&#xff0c;会员数量激增且分布…

Android实现ViewPager剧中放大效果

效果图 实现方式核心思想是自定义PageTransformer继承ViewPager.PageTransformer&#xff0c;精确控制每一个page的动效。 PageTransformer的transformPage方法并不会区分当前的page是哪一个&#xff0c;所以需要我们自己去识别&#xff0c;我的方法是每个page添加一个text显…

Nuxt.js 应用中的 page:transition:finish 钩子详解

title: Nuxt.js 应用中的 page:transition:finish 钩子详解 date: 2024/10/10 updated: 2024/10/10 author: cmdragon excerpt: page:transition:finish 是 Nuxt.js 中的一个事件钩子,专门用于处理页面过渡效果结束后的逻辑。这一钩子在页面过渡的 onAfterLeave 事件之后…