首页 > 数据库 >Redis 缓存系统常见问题及解决方案(缓存击穿,缓存穿透,缓存雪崩)

Redis 缓存系统常见问题及解决方案(缓存击穿,缓存穿透,缓存雪崩)

时间:2023-11-16 20:45:20浏览次数:30  
标签:常见问题 数据库 Redis 查询 缓存 key MySQL

1、缓存穿透

缓存穿透指当用户在 Redis 缓存系统执行一条无效查询时,这条无效查询将穿透 Redis 缓存系统并向 MySQL 数据库请求数据,而 MySQL 数据库也获取不到数据。

黑客可以利用缓存穿透原理,恶意执行大量无效查询,这将会对 MySQL 数据库的访问造成很大的压力

解决方法:

1、缓存空对象

缓存空对象是指用户请求查询 Redis 缓存和 MySQL 数据库中都不存在的数据时,MySQL 数据库会返回一个空对象, 并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓 存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

优点:

        1、机制原理和实现比较简单

        2、代码修改维护容易

缺点:

        1、会导致 Redis 缓存中产生大量空对象

        2、会占用许多的内存空间

        3、会浪费许多资源(推荐设置缓存空对象过期时间)

2、布隆过滤器(推荐)

布隆过滤器是一种基于概率的数据结构,用于快速检索一个元素是否存在于集合中。它可以通过使用多个哈希函数来检测一个元素是否在集合中,能够有效地防止缓存穿透攻击。它的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,会有小小的误判概率,只要参数设置的合理,它的精确度可以控制的相对足够精确

注意:过滤器查询到的数据存在,但数据库中不一定存在,过滤器查询的数据不存在则数据库中也一定不存在

采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层数据库的查询压力

特点:本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构( probabilistic data structure),特点是高效地插入和查询,可以用来 告诉你 “某样东西一定不存在或者可能存在”(相比于传统的 List、 Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回 的结果是概率性的,而不是确切的)


2、缓存击穿

缓存击穿是指Redis 缓存中有一些的热点数据key同时过期失效,或有一些非热点数据key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis缓存,涌入MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃

解决方法:

1、不设置过期时间

缺点:可能会导致内存占用过高,如果Redis中的数据不断增加,而没有过期时间的限制,那么随着时间的推移,Redis的内存占用将不断增大,最终可能导致内存溢出

2、加锁

对于Redis 缓存中 key过期时,在 key要查询MySQL数据库的时候加锁,这时只能让第一个请求进行查询数据库,然后把从数据库中查询到的值存储到Redis缓存中,对于其他的相同的 key查询,可以直接从 Redis 缓存中获取即可

注意:分布式系统需要使基于数据库、Redis 或 zookeeper 的分布式锁


3、缓存雪崩

缓存雪崩是指在某一个时间段内,Redis 缓存突然宕机或大量 key 集中过期失效,如果这个时间段 内有大量请求,而查询数据量巨大,所有的请求都会达到 MySQL 数据库,数据库的访问量会暴增 ,引起数据库压力过大甚至宕机

解决方案:

1、redis高可用

搭建Redis主从架构或集群架构

2、限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个key只允许一个线程查询数据和写缓存,其他线程等待

3、数据预热

将部分可能大量访问的热点数据提前加载到Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的key

4、不同过期时间

设置不同的过期时间让缓存失效的时间点尽量均匀

标签:常见问题,数据库,Redis,查询,缓存,key,MySQL
From: https://www.cnblogs.com/echosada/p/17837226.html

相关文章

  • Redis7 数据持久化AOF
    1、官网介绍2、是什么以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录)只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作默认情况下,redis......
  • 简述几个我们对Redis 7开源社区所做的贡献
    Redis7已经于2022年4月28号正式发布,其中包括了将近50个新的命令,增加了许多新的特性,并且在整个Redis6到Redis7的开发过程中,我也对Redis的开源社区贡献了一些微薄的力量。在这篇文章中,我来给大家介绍几个自己亲身参与的几个Redis7功能,并希望能够为Redis8做出更多的贡献。在这......
  • 缓存雪崩/击穿/穿透
    缓存雪崩大量缓存同时过期,就叫缓存雪崩。缓存中有大量数据同时过期,导致大量请求缓存缺失redis实例宕机措施设置过期时间时,随机小范围打散服务降级缓存命令率下降到警告值或者数据库负载突然增大时,很可能发生了缓存雪崩。可以通过服务降级措施,来保证核心接口能正......
  • Mybatis常见问题
    1.JDBC1.1JDBC是什么高级语言的应用程序需要特定的方式访问数据库。特定的方式:JDBC,ODBCJDBC本质上是一系列的应用程序接口(API)通过JAVA语言访问任何结构化数据库通过JDBCAPI写出的程序,能够将SQL语句发送到相应的任何一种数据库通过使用JDBC,开发人员可以很方便地将SQL语句传送给几......
  • 缓存穿透方案之布隆过滤器
    作用:快速过滤掉不存在数据一种数据结构,特点是高效插入和查询,但是返回的结果是概率性的,不是确切的。使用场景:1.缓存穿透解决方案2.网络爬虫重复下载url解决方案3.HBase客户端查找列族文件数据问题解决方案。......
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
    2023年11月15日,对.net的开发圈是一个重大的日子,.net8.0正式版发布。圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net5.0的时候就各种吹风Aot编译,直到6.07.0使用仍然比较麻烦,我个人比较期待本次更新的aot体验。有的群友几个小时都等不了啦,半夜就开始更新预......
  • prometheus Redis监控方法之二
    背景前期整理过使用exporter+prometheus方式进行Redis监控的搭建过程最近给同事研究clickhouse时发现clickhouse有对应的plugin可以直接拉取CK的信息当时就想其他的中间件肯定有类似的方法进行处理.当时第一反应是想学习使用Oracle,SQLSERVER的pluggin进行监控但是发......
  • go语言和redis实现发邮件
    如何使用Go语言和Redis实现邮件群发原创 磊丰 Go语言圈 2023-10-3108:30 发表于中国香港收录于合集#学Go语言哪些事儿236个MySQL大牛带你全面剖析与系统梳理数据库(mysql等)知识分享,总结数据库技巧和方法,提升你的技术技能。45篇原创内容公众号G......
  • Redis 缓存与数据库数据不一致问题
    Redis缓存与数据库数据不一致问题是指在使用Redis作为缓存系统时,由于缓存和数据库之间的操作没有同步或处理不当,导致缓存中的数据与数据库中的数据不同步,产生数据不一致的情况。现象:数据库更新后,缓存未更新,导致缓存中的数据是旧的。缓存脏读,即缓存中的数据被更新,而数据库中的数据未......
  • Linux下redis的安装下载以及连接RESP
    一、环境Centos7、redis-6.2.6、gcc依赖、管理员权限将防火墙放通6379/tcp端口或直接关闭防火墙二、安装具体步骤1.安装依赖redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装:gcc-v如果没有安装则通过以下命令安装:yumins......