使用Redis的四个常见问题及其解决方案

article/2025/6/6 2:31:34

Redis

缓存穿透

  • 定义:redis查询一个不存在的数据,导致每次都查询数据库

  • 解决方案:

    1. 如果查询的数据为空,在redis对应的key缓存空数据,并设置短TTL。

      因为缓存穿透通常是因为被恶意用不存在的查询参数进行压测攻击,所以采取这种方式会导致大量的无用空间被占用,所以不推荐。

    2. 布隆过滤器,因为哈希冲突,所以可能误判(计算出的下标位置会出现重复,导致不存在的元素被错误地判定为存在),实现框架:RedissonGuava

      1. bitmap(位图):一个以bit为单位的数组,只存储二进制01

      2. 原理:对于一个给定的 key,通过多个不同的 hash 函数 计算得到多个 hash 值,每个 hash 值对 m(bitmap 的大小) 进行 取模运算,得到对应的 bitmap 下标位置,并将这些位置的 bit 值设置为 1。读取时,只需要判断其对应的多个下标位置的元素值是否都为1即可

      3. 如何控制误判率?调整参数:bitmap数组长度m、哈希函数个数k、元素数量n

      4. 支持删除操作吗?不支持,除非使用计数型布隆过滤器(整数数组,存计数值,即添加操作+1,删除操作-1,如果所有计数值都大于0时,元素才可能存在)

      5. 布隆过滤器相比使用 set 的优点?

        • 空间占用: 布隆过滤器相比 set 可以显著节省空间,因为它不存储完整的元素,而是通过哈希映射到bit位

          查询速度: 布隆过滤器通过少量哈希计算(O(k))就能快速判断元素是否存在,在元素数量非常多时,可能比set数据更快,因为set可能需要遍历链表/红黑树

        • bitmap都是01数据,适合集合运算(交、并、补)

缓存击穿

  • 定义:给一个key设置过期时间,当key过期时,恰好对这个key有大量并发请求,在重建缓存这段时间可能导致数据库压力过大

  • 如何检测?监控 Redis 的 keyspace_hits(命中缓存次数)keyspace_misses(未命中缓存次数),计算命中率

  • 解决方案:

    1. 互斥锁(保证强一致性):在Redis查询缓存未命中时,添加互斥锁,然后查询数据库并重建缓存,再释放锁
    2. 逻辑过期+互斥锁(高效):对热点key不设置过期时间,而是给对应的数据添加一个过期时间的字段。过程:
      1. 在查询缓存时发现逻辑时间已经过期,此时添加互斥锁
      2. 开启新子线程:查询数据库并重建缓存,释放互斥锁
      3. 主线程和其他发起请求的线程不需要等待该子线程(trylock),而是直接返回过期数据

缓存雪崩

  • 定义:在同一时段大量的缓存key同时失效或者Redis服务宕机,导致数据库压力过大
  • 解决方案:
    1. key失效:给不同key的TTL的原值加上随机值
    2. 服务宕机Redis集群
    3. 通用:降级限流(nginx或spring cloud gateway),多级缓存

双写一致性

  • 定义:数据库中的数据需要与Redis中的数据保持一致

  • 问题:

    1. 先删除缓存再操作数据库:在删除完缓存操作数据库这段期间,另一个线程重建完缓存
    2. 先操作数据库再删除缓存:在查询完数据库重建缓存这段期间,另一个线程修改了数据库并删除缓存。
  • 高一致性实现方案:

    1. 延迟双删:删除缓存,修改数据库,延迟一会再删除缓存,延迟的原因是等待数据库master同步到slave 。该方法的问题是延迟时间很难确定

    2. 读数据时添加共享锁:其他线程可共享读操作

      写数据时添加排他锁:阻塞其他线程读写操作

  • 弱一致性实现方案:

    1. MQ:修改数据库时,发布消息到mq中,由消费者来删除缓存只能保证redis操作的可靠性
    2. Canal:监听mysqlbinlog(日志文件),把更新后的日志同步到redis里面

http://www.hkcw.cn/article/KyMNQnTgPb.shtml

相关文章

Spark期末基础复习

填空选择判断 第一章 一、填空题 1.Scala语言的特性包含____________、函数式编程的、____________、可扩展的、____________。 2.在Scala 数据类型层级结构的底部有两个数据类型,分别是____________和____________。 3.在Scala中,声明变量的关键字有…

【Zephyr 系列 5】定时器与低功耗控制:打造省电高效的嵌入式系统

🧠关键词:Zephyr、定时器、k_timer、PM、低功耗、STM32、RTC 📌适合人群:想实现周期任务、功耗优化、定时唤醒等功能的 MCU 工程师 ✨ 前言:省电不是选项,而是刚需 在电池供电的嵌入式设备中,功耗决定了产品寿命与可靠性。无论是蓝牙传感器、GPS 跟踪器还是 LoRa 节点…

ATR2660SGNSS L1 频段 低噪声放大器

ATR2660S是一款应用于GNSS接收机的低噪声放大器,芯片集成了有源偏置电路和ESD保护电路,核心电路部分使用两级放大器结构进一步提高功率增益。 主要特征 高增益: 30dB 1575.42MHz 31dB 1176.45MHz 低噪声系数: 1.1dB 1575.42MHz 1.…

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API

Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…

FreeRTOS的简单介绍

一、FreeRTOS介绍 FreeRTOS并不是实时操作系统,因为它是分时复用的 利用CubeMX快速移植 二、快速移植流程 1. 在 SYS 选项里,将 Debug 设为 Serial Wire ,并且将 Timebase Source 设为 TIM2 (其它定时器也行)。为何…

Deepseek/cherry studio中的Latex公式复制到word中

需要将Deepseek/cherry studio中公式复制到word中,但是deepseek输出Latex公式,比如以下Latex代码段,需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

如何爬取google应用商店的应用分类呢?

以下是爬取Google Play商店应用包名(package name)和对应分类的完整解决方案,采用ScrapyPlaywright组合应对动态渲染页面,并处理反爬机制: 完整爬虫实现 1. 安装必要库 # 卸载现有安装pip uninstall playwright scrapy-playwright -y# 重新…

英福康INFICON VGC501, VGC502, VGC503 单通道、双通道和三通道测量装置

英福康INFICON VGC501, VGC502, VGC503 单通道、双通道和三通道测量装置

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…

JsonCpp 库如何集成到Visual studio

这是用于 在 C 中解析和生成 JSON 数据 的工具包,适合在需要与前端、网络、配置等 JSON 格式交互的 C 项目中使用。 Json(基于JsonCpp) 格式全称:JavaScript Object Notation 格式特点: 与开发语言无关轻量级的数据…

sourceinsight4.0不识别.cc解决办法

options—>preferences 选择 c language, 点击右边的 file types, 添加 ;*.cc即可 重新创建工程, 不仅有.cc, 还有.cc的目录结构

RNN结构扩展与改进:从简单循环网络到时间间隔网络的技术演进

本文系统介绍 RNN 结构的常见扩展与改进方案。涵盖 简单循环神经网络(SRN)、双向循环神经网络(BRNN)、深度循环神经网络(Deep RNN) 等多种变体,解析其核心架构、技术特点及应用场景,…

IBM DB2分布式数据库架构

一、什么是分布式数据库架构 分布式数据库架构是现代数据库系统的重要发展方向,特别适合处理大规模数据、高并发访问和高可用性需求的应用场景。下面我们从原理、架构模式、关键技术、实现方式和常见产品几个方面来系统讲 1、分布式数据库的基本概念与原理 1. 什…

第十三章 Java基础-特殊处理

文章目录 1.包和final2.权限修饰符和代码块3.抽象类1.包和final 2.权限修饰符和代码块 3.抽象类

Could not get unknown property ‘mUser‘ for Credentials [username: null]

最近遇到jekins打包报错: Could not get unknown property mUser for Credentials [username: null] of type org.gradle.internal.credentials.DefaultPasswordCredentials_Decorated。 项目使用的是gradle,通过pipeline打docker包;因为ma…

核显战3A,锐龙9000G系列CPU曝光

在刚过去不久的台北国际电脑展上,AMD 为大家带来了 RX 9060 XT、Radeon AI PRO R 9700 显卡以及线程撕裂者系列新品。 尽管狠活儿不少,但这场电脑展仍然让不少同学失望而归。 因为,原本预期亮相锐龙 9000G 系列桌面 APU 竟没有公布半点消息。…

[yolov11改进系列]基于yolov11引入空间通道系统注意力机制SCSA的python源码+训练源码

【SCSA介绍】 1、Spatial and Channel Synergistic Attention ​ 通道和空间注意力分别为各种下游视觉任务的特征依赖性和空间结构关系提取带来了显著的改进。虽然两者的组合更有利于发挥各自的优势,但通道和空间注意力之间的协同作用尚未得到充分探索&#xff0c…

穿越文件之海:Linux链接与库的奇幻旅程,软硬连接与动静态库

文章目录 引言1、软硬链接1.1、基本认知1.2、实现原理1.3、应用场景1.4、取消链接1.5、ACM时间 2、动静态库2.1、认识库2.2、库的作用 3、制作静态库3.2、静态库的使用 4、制作动态库4.1、动态库的打包4.3、动态库的链接原理 5、动态库知识补充 引言 在计算机的无形世界中&…

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJ&#xff…

6.3 计算机网络面试题

网络OSI模型和TCP/IP模型分别介绍一下 OSI 应用层:http htps DNS 为应用程序提供统一的接口表示层:将数据转换为兼容另一个系统能识别的格式会话层: 建立管理终止表示层实体之间的通信会话传输层: tcp udp 负责端到端的数据传输网络层: ip …