redis缓存预热、缓存穿透的详细教程

2024-09-07 23:28

本文主要是介绍redis缓存预热、缓存穿透的详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

    作此篇主要在于关于redis的缓存预热、缓存雪崩、缓存击穿和缓存穿透在面试中经常遇到,工作中也是经常遇到。中级程序员基本上不可避免要克服的几个问题,希望一次性解释清楚

缓存预热

MySQL加入新增100条记录,一般默认以MySQL为准为底单数据,如何同步给redis(布隆过滤器)
这是100合法数据,mysql有100条新纪录,但是redis无。
    为什么需要预热
    1)比较懒,什么都不做,之对mysql做了数据新增,利用回写机制,让他逐渐实现100条新增的记录同步
最好提前晚上部署发布版本的时候,由自己人提前做一次,让redis同步了,不要把这个问题留给客户。
    2)通过中间件或者程序自行完成。

缓存穿透

    请求查询一条记录,先查看redis无,后查mysql无,都查不到该条记录,但是请求每次都会打到数据库上面去,导致后台压力暴增,这种现象成为雪崩。
    简单的说就是缓存和数据都差不多数据。而且也会存在反复穿透的恶意攻击给系统带来的伤害。严重是可以直接打爆数据库的。

解决方案1

空对象缓存或者省缺值
    如果发生了缓存穿透,我们可以针对要查找的数据,在redis里存一个和业务部门商量后确定的省缺值(比如0,负数、defaultNull等)
    举个例子:如比一个键值,uid:asddf,值defauNull为案例的key和value,先去redis查键uid:asddfxxx没有,再去查MySQL没有获取数据,这次一次穿透。但是在这我们增强回写机制,mysql也查不到的话也让redis存入查不到的key并保护mysql。
但是次方法架不住黑客恶意攻击,也有缺陷。只能解决key相同 的情况。具体表现为黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库查询。可能会导致你的数据库由于压力过大而宕机。
其中攻击类型有如下两种:

1.相同的key攻击

    第一次打到MySQL,空对象缓存后对第二次就返回defaultNull缺省值,避免mysql被攻击,不用再用到数据库中去查询数据,浪费数据库资源。

2.不同的key攻击

    由于存在空对象缓存和缓存回写redis中的无关紧要的key也会越写越多,如果不设置过期时间的情况下,会极大的浪费内存空间。

解决方案2

    Google布隆过滤器Guava解决缓存击穿问题。
什么是布隆过滤器,如下如所示,它的数据结构有点像数据结构中的哈希,不过传统的哈希数据结构,一个对象只能占用数组的一个坑位。而布隆过滤器一个对象可以占用多个数组的坑位。具体如下图所示,一个字符串对象可以有多个哈希值,每一个哈希值都对应一个数组坑位。
在这里插入图片描述
    布隆过滤器用来做什么?很显然,解决缓存穿透问题(废话)。将所有合法的key将入到布隆过滤器中,设置一个白名单,在所有访问之前需要经过布隆过滤器,如果key值经过布隆过滤器校验不存在,则判定为非法key,避免了访问数据库。具体的工作流程如下流程图所示。
在这里插入图片描述
注意:所有的可以都往过滤器里放。

结语

    点赞、收藏。多谢多谢。

这篇关于redis缓存预热、缓存穿透的详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146462

相关文章

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker