Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

news2024/11/22 16:26:30

在这里插入图片描述

目录

    • 一、缓存预热
      • 1、缓存预热常见步骤
      • 2、代码实现
    • 二、缓存雪崩
      • 1、什么情况会发生缓存雪崩?
      • 2、Redis缓存集群实现高可用
      • 3、如何避免Redis缓存雪崩?
    • 三、缓存穿透
      • 1、什么情况会发生缓存穿透?
      • 2、如何避免Redis缓存穿透?
    • 四、通过空对象缓存解决缓存穿透
    • 五、Google布隆过滤器Guava解决缓存穿透
      • 1、引入pom
      • 2、创建布隆过滤器
      • 3、fpp误判率
    • 六、Redis缓存击穿
      • 1、什么情况会发生缓存击穿?
      • 2、如何避免Redis缓存击穿?
    • 七、Redis缓存击穿解决方案
      • 1、互斥更新
      • 2、差异失效时间
    • 往期回顾

大家好,我是哪吒。

一、缓存预热

Redis缓存预热是指在服务器启动或应用程序启动之前,将一些数据先存储到Redis中,以提高Redis的性能和数据一致性。这可以减少服务器在启动或应用程序启动时的数据传输量和延迟,从而提高应用程序的性能和可靠性。

1、缓存预热常见步骤

(1)数据准备

在应用程序启动或服务器启动之前,准备一些数据,这些数据可以是静态数据、缓存数据或其他需要预热的数据。

(2)数据存储

将数据存储到Redis中,可以使用Redis的列表(List)数据类型或集合(Set)数据类型。

(3)数据预热

在服务器启动或应用程序启动之前,将数据存储到Redis中。可以使用Redis的客户端工具或命令行工具来执行此操作。

(4)数据清洗

在服务器启动或应用程序启动之后,可能会对存储在Redis中的数据进行清洗和处理。例如,可以删除过期的数据、修改错误的数据等。

需要注意的是,Redis缓存预热可能会增加服务器的开销,因此应该在必要时进行。同时,为了减少预热的次数,可以考虑使用Redis的其他数据类型,如哈希表(Hash)或有序集合(Sorted Set)。此外,为了提高数据一致性和性能,可以使用Redis的持久化功能,将数据存储到Redis中,并在服务器重启后自动恢复数据。

2、代码实现

@Component
@Slf4j
public class BloomFilterInit
{
    @Resource
    private RedisTemplate redisTemplate;

    //初始化白名单数据
    @PostConstruct
    public void init() {
        //1 白名单客户加载到布隆过滤器
        String key = "customer:1";
        //2 计算hashValue,由于存在计算出来负数的可能,我们取绝对值
        int hashValue = Math.abs(key.hashCode());
        //3 通过hashValue和2的32次方后取余,获得对应的下标坑位
        long index = (long)(hashValue % Math.pow(2,32));
        log.info(key+" 对应的坑位index:{}",index);
        //4 设置redis里面的bitmap对应类型白名单:whitelistCustomer的坑位,将该值设置为1
        redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);

    }
}

二、缓存雪崩

Redis缓存雪崩是指在缓存系统中,由于某些原因,缓存的数据突然大量地被删除或修改,导致缓存系统的性能下降,甚至无法正常工作。

1、什么情况会发生缓存雪崩?

(1)误删除

由于误操作或故障,缓存系统可能会误删除一些正常的数据。这种情况通常会在数据库中发生。

(2)误修改

由于误操作或故障,缓存系统可能会误修改一些正常的数据。这种情况通常会在数据库中发生。

(3)负载波动

缓存系统通常会承受一定的负载波动,例如,在高峰期间,数据量可能会大幅增加,从而导致缓存系统的性能下降。

(4)数据变化频繁

如果缓存系统中的数据变化频繁,例如,每秒钟都会有大量的数据插入或删除,那么缓存系统可能会因为响应过慢而导致雪崩。

2、Redis缓存集群实现高可用

(1)主从 + 哨兵

(2)Redis集群

(3)开启Redis持久化机制aof/rdb,尽快恢复缓存集群。

3、如何避免Redis缓存雪崩?

(1)数据备份

定期备份数据,以防止误删除或误修改。

(2)数据同步

定期同步数据,以防止数据不一致。

(3)负载均衡

使用负载均衡器将请求分配到多个Redis实例上,以减轻单个实例的负载。

(4)数据优化

优化数据库结构,减少数据变化频繁的情况。

(5)监控与告警

监控Redis实例的性能指标,及时发现缓存系统的异常,并发出告警。

三、缓存穿透

Redis缓存穿透是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存穿透?

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致穿透。

2、如何避免Redis缓存穿透?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

在这里插入图片描述

四、通过空对象缓存解决缓存穿透

如果发生了缓存穿透,可以针对要查询的数据,在Redis中插入一条数据,添加一个约定好的默认值,比如defaultNull。

比如你想通过某个id查询某某订单,Redis中没有,MySQL中也没有,此时,就可以在Redis中插入一条,存为defaultNull,下次再查询就有了,因为是提前约定好的,前端也明白是啥意思,一切OK,岁月静好。

这种方式只能解决key相同的情况,如果key都不同,则完蛋。

五、Google布隆过滤器Guava解决缓存穿透

在这里插入图片描述

1、引入pom

<!--guava Google 开源的 Guava 中自带的布隆过滤器-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

2、创建布隆过滤器

BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);

(3)布隆过滤器中添加元素

bloomFilter.mightContain(1)

(4)判断布隆过滤器中是否存在

bloomFilter.mightContain(1)

3、fpp误判率

@Service
@Slf4j
public class GuavaBloomFilterService {
    public static final int SIZE = 1000000;

    //误判率
    public static double fpp = 0.01;

    //创建guava布隆过滤器
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);
    
    public void guavaBloomFilter() {
        for (int i = 1; i <= SIZE; i++) {
            bloomFilter.put(i);
        }
        ArrayList<Integer> list = new ArrayList<>(10000);

        for (int i = SIZE + 1; i <= SIZE + (10000); i++) {
            if (bloomFilter.mightContain(i)) {
                log.info("被误判了:{}", i);
                list.add(i);
            }
        }
        log.info("误判总数量:{}", list.size());
    }
}

六、Redis缓存击穿

Redis缓存击穿是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存击穿?

根本原因:热点Key失效

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致击穿。

2、如何避免Redis缓存击穿?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

七、Redis缓存击穿解决方案

1、互斥更新

通过双检加锁机制。

2、差异失效时间

在这里插入图片描述
先更新从缓存B,再更新主缓存A,而且让从缓存B的缓存失效时间长于A,保证A失效时,B还在。

往期回顾

2023年再不会Redis,就要被淘汰了

图解Redis,谈谈Redis的持久化,RDB快照与AOF日志

Redis单线程还是多线程?IO多路复用原理

Redis集群的最大槽数为什么是16384个?

Redis缓存穿透、击穿、雪崩到底是个啥?7张图告诉你

Redis分布式锁的实现方式

Redis分布式缓存、秒杀

在这里插入图片描述

🏆本文收录于,数据库基础教程系列。

打造Java封神宇宙,数据库精品专栏重磅推出,目标打造CSDN最强数据库专栏,包含MySQL基础、MySQL进阶、Redis、MongoDB等数据库基础知识。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

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

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

相关文章

Vue中如何实现轮播图、滑块选择器

Vue中如何进行滑动组件实现 在Vue应用中&#xff0c;滑动组件是一个常见的UI组件&#xff0c;例如轮播图、滑块选择器等等。本文将介绍如何使用Vue实现这些滑动组件。 轮播图 轮播图是一种常用的滑动组件&#xff0c;它通常用于展示多个图片或广告。在Vue中&#xff0c;我们可…

【人工智能里的数学】多元函数的微分学

【人工智能里的数学】多元函数的微分学 系列文章目录 【人工智能学习笔记】人工智能里的数学——概述 【人工智能里的数学】一元函数微分学 【人工智能里的数学】线性代数基础 【人工智能里的数学】多元函数微分学 文章目录 文章目录 系列文章目录文章目录偏导数高阶偏导数梯…

论文笔记--LIMA: Less Is More for Alignment

论文笔记--LIMA: Less Is More for Alignment 1. 文章简介2. 文章概括3 文章重点技术3.1 表面对齐假设(Superfacial Alignment Hypothesis)3.2 对齐数据3.3 训练 4 数值实验5. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;LIMA: Less Is More for Alignm…

FTP协议分析(主动模式和被动模式)

今天本来计划分析下suricata中协议识别和解析的代码的&#xff0c;准备先从ftp协议开始看&#xff0c;不过看了一会儿代码后&#xff0c;还是觉得有必要对ftp协议的细节先熟悉熟悉。 目录 1、FTP环境搭建工具 2、FTP协议介绍 3、FTP文件操作命令列表 4、FTP请求码列表 5、…

硬件测试---相位噪声测试

一&#xff1a;相位噪声的概述 相位噪声是指信号或振荡器在频率上的相位变动或不稳定性。它是相对于理想稳定振荡器的相位偏离或波动的度量。相位噪声的存在意味着信号的相位在时间上会有微小的变化或扰动&#xff0c;这可能对某些应用产生负面影响。 相位噪声通常以相位噪声密…

【电子技术综合设计】数字钟(包含计数模块、12/24进制切换模块以及闹钟模块)

工程文件&#xff1a; https://pan.baidu.com/s/1PnYd2mwMUf0tgxczdcl2MA 提取码: ihrk B站演示&#xff1a; 【电子技术综合设计】数字电子时钟&#xff08;包含计数模块、12/24进制切换模块以及闹钟模块&#xff09;_哔哩哔哩_bilibili 一、设计要求 1. 24小时制的时、分…

基于Java汽车在线租赁管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

吴恩达老师《机器学习》课后习题2之逻辑回归(logistic_regression)

逻辑回归-线性可分 用于解决输出标签y为0或1的二元分类问题。判断邮件是否属于垃圾邮件&#xff1f;银行卡交易是否属于诈骗&#xff1f;肿瘤是否为良性&#xff1f;等等。 案例:根据学生的两门学生成绩&#xff0c;建立一个逻辑回归模型&#xff0c;预测该学生是否会被大学录…

一、深度学习引言

文章目录 一、机器学习中的关键组件1. 数据2. 模型3. 目标函数4. 算法 二、各种机器学习问题1. 有监督学习1.1 回归1.2 分类1.3 标记问题1.4 搜索1.5 推荐系统1.6 序列学习 2. 无监督学习3. 与环境互动4. 强化学习 三、深度学习的发展 一、机器学习中的关键组件 1. 数据 数据…

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2 OLED库的移植 1、U8g2简介 手头正好有一块0.96寸的OLED屏&#xff0c;驱动芯片为ssd1306&#xff0c;心想怎么才能显示更为炫彩的图像。无意间&#xff0c;接触到U8g2图形库&#xff0c;遂决定将其移植到自己的工程中。 U8g…

2023软件测试面试避坑指南

今年2023整体IT行业不景气&#xff0c;大厂小厂裁员不断&#xff0c;因岗位稀缺&#xff0c;匹配性&#xff0c;竞争大&#xff0c;被裁以后面临房贷、车贷等压力&#xff0c;不得不看下银行卡&#xff0c;还能够支撑多久&#xff0c;得赶紧地找下一家&#xff0c;但偏偏事与愿…

深入学习 Mybatis 的四大组件源码

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

JavaScript之ES6高级语法(一)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 ES6高级语法&#xff08;一&#xff09; 前言一、垃圾回收机制&#xff08;Garbage Collection&#xff09;1.1、引用计数法…

看病排队问题

目录 一、代码 二、功能函数介绍 三、运行截图 一、代码 #define _CRT_SECURE_NO_WARNINGS 1//不用VS删除这一行 #include<stdio.h> #include<stdlib.h> struct LinkQueue {int data;struct LinkQueue* next; };struct Node {LinkQueue* frount;LinkQueue* re…

docker无法启动 -> 缺少libseccomp

systemctl status docker.servicejournalctl -u dockeryum install -y libseccomplibseccomp是一个用于Linux操作系统的安全计算模式&#xff08;seccomp&#xff09;的用户空间库。seccomp是一种Linux内核特性&#xff0c;允许限制进程可以执行的系统调用&#xff0c;以增加应…

C语言中的基本数据类型

C语言中的基本数据类型分别为以下几种 整型、浮点型、字符类型 整型又分为整型int、短整型short、长整型long 浮点型分为单精度浮点型float、双精度浮点型double 1、短整型short 2.整型 3.长整型 短整型、长整型、整形都是表示整形的&#xff0c;并且输出结果也都为10&…

教你如何批量关闭窗口,省时又省力!

哈喽哈喽&#xff0c;大家好&#xff0c;今天我们来分享一个小功能。 在实际的应用场景中&#xff0c;我们可能需要打开多个窗口&#xff0c;在关闭窗口时&#xff0c;逐个关闭窗口可能比较繁琐&#xff0c;而且有些窗口虽然不再显示了&#xff0c;但可能是隐藏的。在这种情况…

Flutter 库:强大的工具及扩展——nb_utils

Flutter 库&#xff1a;强大的工具及扩展——nb_utils 文章目录 Flutter 库&#xff1a;强大的工具及扩展——nb_utils一、概述1、简介2、功能3、官方资料 二、基本使用1、安装2、基本使用第一步&#xff1a;在 main.dart 中初始化第二步&#xff1a;在您的 MaterialApp 或 Cup…

java的字符输入流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节&#xff08;读多少个与字符集有关&#xff09;&#xff1b;输出流底层会把数据按照指定的编码方式进行编码&#xff0c;变成字节再写到文件中。 字…

15个提效的设计类AI生成工具推荐

最近越来越多的AI工具如雨后春笋般涌现。我相信很多设计师会开始使用人工智能工具来帮助我们提高工作效率。 本文整理了15种易于使用的设计类AI工具 即时 AI 即时 AI 是通过自然语言描述&#xff0c;快速生成可编辑的 UI 设计稿的设计工具。 输入文字描述后&#xff0c;即可…