当前位置: 首页 > news >正文

Redis三剑客解决方案

文章目录

      • 缓存穿透
        • 缓存穿透的概念
        • 两种解决方案:
      • 缓存雪崩
      • 缓存击穿

画板

缓存穿透

缓存穿透的概念

每一次查询的 key 都不在 redis 中,数据库中也没有。

一般都是属于非法的请求,比如 id<=0,比如可以在 API 入口做一些参数校验。

大量访问不存在的 key,严重影响系统的性能。

两种解决方案:

第一种 查询不存在的数据时,第一次查 db,没有查到结果直接返回 value 为 null,将这个 key 记录到 redis 中去。

使用空对象解决缓存击穿,但是如果数据库中新增了该空对象,也就是不是空对象了,这个时候怎么办呢?

1.value 为 null 的 key 设定一个过期时间比如 30s,如果这个请求在过期时间之后进来那么就没事。

2.在添加请求的时候,更新缓存的内容。

第二种 构建一个布隆过滤器,记录全量数据.

布隆过滤器也是重点内容,借助位图的数据结构,设计的很巧妙.

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

这个地方也可以引导面试官深挖布隆过滤器的内容,比如布隆过滤器的误判等情况。

缓存雪崩

大量的存储数据同时过期了,用户的请求全部打到 mysql 上面去了。或者 Redis 故障宕机的时候,请求同样都是打到 Redis 上面。

对用缓存雪崩的解决方案:

  1. 设置均匀的过期时间,避免将大量的数据设置成同一个过期时间,设置缓存数据过期的时候给数据加上一个随机数,保证数据不会在同一个时间过期。

2 互斥锁:如果发现访问的数据不在 redis 中,加一个互斥锁,保证同一时间内只有一个请求构建缓存。当缓存构建完成之后在释放锁,对于未能获取锁的请求,设置等待锁释放后重新读取缓存,要么就返回空值或者默认值。

3.让缓存一直有效,业务线程不在更新缓存,也不设置有效期,而是将缓存的更新工作交给后台线程定时更新。

业务线程不负责更新缓存,缓存也不设置过期时间,让缓存永久有效,将缓存的更新工作交给后台线程定时更新。

业务线程发现缓存消息失效后,通过消息队列发送一条消息通知后台进程更新缓存,后台线程接收消息进行更新缓存。

缓存击穿

业务中通常有一些数据会被频繁的访问,比如秒杀活动,秒杀的商品信息,这个肯定要存在 Redis 中的,被频繁访问的数据被称为热点数据,如果缓存中这个数据过期了,大量的请求直接到数据库中,那么数据库就很容易被请求冲垮掉,这就是缓存击穿存在的问题。

缓存击穿可以任务是缓存雪崩的子集,同样可以采取互斥锁或者不给热点数据设置过期时间。

这个可以认为是热 key。

http://www.lryc.cn/news/540917.html

相关文章:

  • 大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点
  • Docker Mysql 数据迁移
  • ubuntu22.04离线安装K8S
  • 微信小程序中将图片截图为正方形(自动居中)
  • 传统的自动化行业的触摸屏和上位机,PLC是否会被取代?
  • 【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶
  • 2024年数字政府服务能力优秀创新案例汇编(附下载)
  • Ollama Docker 镜像部署
  • [深度学习][python]yolov12+bytetrack+pyqt5实现目标追踪
  • 【深度学习】矩阵的理解与应用
  • 我是如何从 0 到 1 找到 Web3 工作的?
  • 《Keras 3 :使用 Vision Transformers 进行物体检测》:此文为AI自动翻译
  • java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
  • module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
  • 将RocketMQ集成到了Spring Boot项目中,实现站内信功能
  • Deepseek 怼CHATGPT实况
  • 基础篇11-图像分割(上)--阈值的方法
  • [特殊字符] LeetCode 62. 不同路径 | 动态规划+递归优化详解
  • 常用的 JVM 参数:配置与优化指南
  • 【JavaWeb学习Day17】
  • DeepSeek 提示词:定义、作用、分类与设计原则
  • 前端大文件上传
  • JDK源码系列(一)Object
  • 【Python 打造高效文件分类工具】
  • 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1)
  • 边缘安全加速(Edge Security Acceleration)
  • C/C++高性能Web开发框架全解析:2025技术选型指南
  • fedora 安装 ffmpeg 过程记录
  • 【GPU驱动】OpenGLES图形管线渲染机制
  • Spring Boot项目@Cacheable注解的使用