Redis缓存击穿和缓存雪崩是两种常见的缓存问题,它们都可能导致系统性能下降甚至崩溃。以下是对它们的详细解释:

一、缓存击穿

  1. 定义

    • 缓存击穿是指一个特定的缓存数据失效(例如过期),而此时大量请求同时访问这个数据,导致这些请求直接穿透到数据库,给数据库带来巨大压力,甚至可能使数据库崩溃。

    • 例如,假设有一个热门商品的详情页数据存储在Redis缓存中,缓存的有效期是1小时。当缓存过期的那一刻,如果大量用户同时请求这个商品详情页,这些请求就会直接查询数据库。

  2. 解决方案

    • 互斥锁(Mutex)机制:当缓存失效时,通过互斥锁确保只有一个线程去数据库查询数据,其他线程等待。例如,使用Redis的SETNX命令(SET if Not eXists)来实现锁。当一个线程获取到锁后,它会去数据库查询数据并更新缓存,其他线程等待锁释放后再从缓存中获取数据。

    • 设置热点数据永不过期:对于一些访问量极高且数据不会频繁变化的热点数据,可以将其缓存设置为永不过期。不过这种方式需要谨慎使用,因为如果数据需要更新,就需要手动清除缓存并重新加载。

    • 本地缓存降级:在应用本地使用本地缓存(如Guava Cache)作为二级缓存。当Redis缓存失效时,先从本地缓存获取数据,本地缓存失效后再去数据库查询,并同时更新本地缓存和Redis缓存。

二、缓存雪崩

  1. 定义

    • 缓存雪崩是指在缓存层(如Redis)的大量缓存数据在同一时间过期,导致大量请求同时穿透到数据库,给数据库带来巨大的压力。这种情况通常发生在缓存服务重启或者缓存数据的过期时间设置不合理时。

    • 例如,假设系统中很多缓存数据的过期时间都设置为1小时,当1小时后这些缓存同时失效,大量请求就会同时查询数据库。

  2. 解决方案

    • 设置不同的过期时间:为缓存数据设置不同的过期时间,避免大量缓存同时失效。例如,可以为不同的缓存数据设置随机的过期时间范围,如1小时到1小时30分钟之间。

    • 使用本地缓存作为缓冲:在应用本地使用本地缓存(如Guava Cache)作为二级缓存。当Redis缓存失效时,本地缓存可以暂时缓解压力,同时从数据库加载数据并更新Redis缓存。

    • 引入消息队列:当缓存失效时,将请求放入消息队列,通过异步处理的方式逐步从数据库加载数据并更新缓存。这样可以避免大量请求同时直接访问数据库。

    • 使用持久化机制:Redis提供了RDB(Redis Database Backup)和AOF(Append Only File)持久化机制。在Redis重启后,可以通过这些持久化机制快速恢复缓存数据,减少缓存失效带来的影响。

一、互斥锁的实现原理

  1. 锁的获取

    • 使用SETNX命令尝试为某个键设置值。如果键不存在,则设置成功,返回1,表示获取锁成功;如果键已经存在,则设置失败,返回0,表示获取锁失败。

    • 可以结合EXPIRE命令为锁设置一个过期时间,防止线程获取锁后因异常导致锁无法释放。

  2. 锁的释放

    • 当线程完成任务后,通过DEL命令删除锁对应的键,释放锁。

二、互斥锁的实现步骤

  1. 尝试获取锁

    • 使用SETNX命令尝试获取锁,并设置过期时间。

  2. 执行业务逻辑

    • 如果获取锁成功,执行业务逻辑(例如查询数据库并更新缓存)。

  3. 释放锁

    • 完成业务逻辑后,释放锁。

三、代码示例(Java)

以下是使用Jedis(一个Java Redis客户端)实现互斥锁的代码示例:

java

复制

import redis.clients.jedis.Jedis;public class RedisMutexLock {private static final String LOCK_SUCCESS = "OK";private static final String SET_IF_NOT_EXIST = "NX";private static final String SET_WITH_EXPIRE_TIME = "PX";private Jedis jedis;private String lockKey;private int expireTime; // 锁的过期时间,单位为毫秒public RedisMutexLock(Jedis jedis, String lockKey, int expireTime) {this.jedis = jedis;this.lockKey = lockKey;this.expireTime = expireTime;}// 尝试获取锁public boolean tryLock() {String result = jedis.set(lockKey, LOCK_SUCCESS, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);return LOCK_SUCCESS.equals(result);}// 释放锁public void unlock() {jedis.del(lockKey);}public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);String lockKey = "myLock";int expireTime = 3000; // 锁的过期时间为3秒RedisMutexLock lock = new RedisMutexLock(jedis, lockKey, expireTime);// 尝试获取锁if (lock.tryLock()) {try {// 执行业务逻辑System.out.println("Lock acquired. Executing business logic...");// 模拟业务逻辑处理时间Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁lock.unlock();System.out.println("Lock released.");}} else {System.out.println("Failed to acquire lock.");}}
}

总结

缓存击穿和缓存雪崩都是缓存系统中常见的问题,它们都会导致数据库压力过大。解决这些问题的关键在于合理设计缓存策略,例如设置合理的过期时间、使用互斥锁、引入本地缓存和消息队列等。通过这些方法可以有效缓解缓存失效带来的压力,提高系统的稳定性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87782.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87782.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87782.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python训练营Day4

浙大疏锦行 Python训练营Day4 内容,pandas处理表格信息: 查看表格统计信息: data.mean()data.mode()data.median() 查看表格信息: data.info()data.describe()data.isnull()data.head() 填充空缺列: 数值型&#xff…

React 基本介绍与项目创建

为什么使用 React 以及前端框架 工作原理 React 通过构建虚拟 DOM(Virtual DOM)来高效管理界面。当组件的状态或属性发生变化时,React 会重新渲染生成新的虚拟 DOM,并通过 Diff 算法找出新旧虚拟 DOM 树之间的差异,最…

OpenCV CUDA模块设备层-----“小于阈值设为零” 的图像处理函数thresh_to_zero_func()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV CUDA 模块(cudev) 中的一个仿函数生成器,用于创建一个 “小于阈值设为零” 的图像处理函数对象。 这个函…

数字图像处理学习笔记

1-图像处理基础_哔哩哔哩_bilibili 输出图像像素点需要将图象值要作类型转换,转成Int 图像仿射变换 线性变换平移 线性变换: 1,变换前直线,变换后仍然直线 2,直线比例不变 3,直线到远点的距离不变 仿射变…

用systemd管理GreatSQL服务详解

用systemd管理GreatSQL服务详解 1.GreatSQL服务文件 官网 greatsql.service 文件 [Unit] DescriptionGreatSQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Aftersyslog.target [Install] …

【AIGC】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC 文章目录 🍊1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 🍊2 建构AIGC伦理观:实现人机共创的永…

WebSocket技术全面解析:从历史到实践

WebSocket技术全面解析:从历史到实践 WebSocket作为一种全双工通信协议,彻底改变了Web应用的实时交互模式。它于2011年被IETF正式标准化为RFC 6455,解决了传统HTTP协议在实时通信中的根本缺陷。本文将深入探讨WebSocket的发展历程、技术原理、…

单用户模式、紧急模式、救援模式有什么区别

文章目录 **一、单用户模式(Single User Mode)****功能与用途****启动特点****进入方式** **二、紧急模式(Emergency Mode)****功能与用途****启动特点****进入方式** **三、救援模式(Rescue Mode)****功能…

【大模型入门】访问GPT的API

目录 0 前言 免费访问GPT的API Windows下环境变量的设置 1 非流式输出 1.1 使用requests库 1.2 使用OpenAI库 2 流式输出 2.1 使用requests库 2.2 使用OpenAI库 3 使用OpenAI库与GPT聊天(存储对话历史版) 4 嵌入向量embeddings 4.1 创建嵌入向…

Jenkins 部署脚本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止旧进程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固态闪存NV196NV201

美光固态闪存技术深度解析:NV183、NV185、NV196与NV201系列 一、技术架构与核心参数对比 1. 制程工艺与容量布局 美光NV183/NV185/NV196/NV201系列采用176层3D NAND技术,通过垂直堆叠提升存储密度。其中: NV183:主打256GB容量段…

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子技术中,逆变电源的设计与应用占据了至关重要的位置。今天,我将为您介绍一个优秀的开源项目——基于单片…

Docker Buildx 构建多架构镜像(Redis、Mysql、Java8、Nginx)

目标 ARM64 麒麟电脑无法直接拉取 Redis 镜像,需在 Windows x86 电脑上通过 多架构构建工具(如 Docker Buildx) 生成适配 ARM64 的 Redis 镜像,再打包传输到目标设备。 一、核心问题:跨架构镜像兼容性 直接保存的 redi…

代理IP的安全陷阱:如何避免中间人攻击与IP池污染?

在跨境业务、数据采集等场景中,代理IP已成为刚需工具。然而,其隐藏的安全风险却常被忽视——轻则泄露隐私,重则导致账号封禁、数据劫持甚至金融损失。本文将深入剖析两大核心风险(中间人攻击与IP池污染),并…

深入理解大语言模型中的超参数:Temperature、Top-p 与更多

随着大语言模型(LLM)如 GPT、Claude、Gemini 的广泛应用,调优生成文本的质量与风格成为开发者和研究人员的重要课题。其中,超参数(Hyperparameters)如 temperature 和 top_p 扮演了核心角色,影响…

译码器Multisim电路仿真汇总——硬件工程师笔记

目录 74LS实现二线三线译码器 1 74LS139D和74LS138D基础知识 1.1 74LS139D 二线四线译码器 1.1.1 功能特点 1.1.2 引脚功能 1.1.3 工作原理 1.1.4 应用场景 1.1.5 使用方法 1.1.6 注意事项 1.6.7 逻辑真值表 1.2 74LS138D 3线8线译码器 1.2.1 功能特点 1.2.2 引脚…

国产 OFD 标准公文软件数科 OFD 阅读器:OFD/PDF 双格式支持,公务办公必备

各位办公软件小达人们,今天咱来聊聊数科OFD阅读器! 软件下载地址安装包 这软件啊,是基于咱国家自主OFD标准的版式阅读软件,主要用来阅读和处理OFD/PDF电子文件,还能用于公务应用扩展。它支持打开和浏览OFD/PDF格式的文…

vue中的toRef

在 Vue 中, toRef 函数用于将响应式对象的属性转换为一个独立的 ref 对象,同时保持与原始属性的关联。其参数格式及用法如下: toRef 的参数说明 1. 参数 1:源对象(必须) - 类型: Object &…

暖通锅炉的智能管控:物联网实现节能又舒适​

暖通锅炉系统在建筑供暖、工业供热等领域扮演着重要角色,其运行效率和能源消耗直接关系到用户的使用体验和成本支出。传统的暖通锅炉管理方式往往依赖人工操作和经验判断,存在能耗高、调节不灵活、舒适性差等问题。随着物联网技术的发展,暖通…

PHP:从入门到进阶的全面指南

PHP(Hypertext Preprocessor)作为一种广泛使用的开源脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中。自诞生以来,PHP 凭借其简单易学、功能强大以及丰富的生态系统,成为了众多网站和 Web 应用程序开发的首选语言之一。…