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

相关文章

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优