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

相关文章

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Redis中如何实现商品秒杀

《Redis中如何实现商品秒杀》:本文主要介绍Redis中如何实现商品秒杀问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录技术栈功能实现步骤步骤一:准备商品库存数据步骤二:实现商品秒杀步骤三:优化Redis性能技术讲解Redis的List类型Redis的Set