Redis-缓存问题及解决方案

本文已收录于专栏
《中间件合集》

目录

  • 概念说明
  • 缓存问题
    • 缓存击穿
      • 问题描述
      • 解决方案
    • 缓存穿透
      • 问题描述
      • 解决方案
    • 缓存雪崩
      • 问题描述
      • 解决方案
        • 提高缓存可用性
        • 过期时间配置
        • 熔断降级
  • 总结提升

概念说明

  Redis是一个开源的内存数据库,也可以用作缓存系统。它支持多种数据结构,包括字符串、列表、集合、哈希表、有序集合等。Redis的缓存功能主要通过将数据存储在内存中来提高读取速度,并且可以定期将数据持久化到磁盘上,以防止数据丢失。

Redis的缓存特点包括:

  1. 高性能:由于数据存储在内存中,读写速度非常快。
  2. 支持多种数据结构:可以存储不同类型的数据,包括字符串、列表、集合等。
  3. 分布式:可以部署在多台服务器上,支持数据的分布式存储和访问。
  4. 数据持久化:可以将数据定期或实时地持久化到磁盘上,以防止数据丢失。
  5. 支持事务:可以通过事务来保证多个操作的原子性。
  6. 支持发布订阅模式:可以实现消息的发布和订阅,用于消息队列等场景。

  虽然Redis给我们提供了非常方便的服务,但是在使用Redis的时候也需要注意其中的一些问题,包括缓存击穿、缓存穿透、缓存雪崩等问题,这些问题可能会导致我们的服务不能提供正常的服务,下面我们就详细说一下这些问题以及对应的解决方案。

缓存问题

缓存击穿

问题描述

  缓存击穿(Cache Breakdown): 缓存击穿指的是针对某个热点数据的并发访问,当某个数据在缓存中过期或者被删除时,大量的并发请求同时访问该数据,导致这些请求都直接访问数据库。这会导致数据库负载剧增,严重影响系统性能。
在这里插入图片描述

解决方案

  1、加锁更新:在缓存失效时,只允许一个线程去查询数据库,其他线程等待结果即可。⽐如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写⼊缓存,再返回给⽤户,这样后⾯的请求就可以从缓存中拿到数据了。
在这里插入图片描述

  2、预先加载热点数据:在缓存失效前主动加载热点数据到缓存中,避免缓存失效时的并发访问。

缓存穿透

问题描述

  缓存穿透(Cache Penetration): 缓存穿透指的是查询一个不存在的数据,由于缓存中没有该数据,每次查询都直接访问数据库。这种情况可能是恶意攻击或者查询不存在的数据导致,但无论原因如何,都会导致数据库压力过大。
在这里插入图片描述

解决方案

  1、缓存控制/默认值:在数据库不命中之后,把⼀个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取,这样就保护了数据库。
在这里插入图片描述
  2、布隆过滤器:详细了解布隆过滤器请参考下面这篇博客:https://wzill.blog.csdn.net/article/details/136021578

缓存雪崩

问题描述

  缓存雪崩(Cache Avalanche): 缓存雪崩指的是在某个时间点,大量缓存数据同时失效,导致大量请求直接访问数据库,导致数据库压力过大,甚至宕机。这种情况可能是由于缓存数据的过期时间设置相近,或者服务器宕机导致的。缓存雪崩是三⼤缓存问题⾥最严重的⼀种。
在这里插入图片描述

解决方案

提高缓存可用性
  1. 集群部署:通过集群来提升缓存的可⽤性,可以利⽤Redis本⾝的Redis Cluster或者第三⽅集群⽅案如Codis等
  2. 多级缓存:设置多级缓存,第⼀级缓存失效的基础上,访问⼆级缓存,每⼀级缓存的失效时间都不同。
过期时间配置
  1. 均匀过期:为了避免⼤量的缓存在同⼀时间过期,可以把不同的 key 过期时间随机⽣成,避免过期时间太过集中。
  2. 热点数据永不过期。
熔断降级
  1. 服务熔断:当缓存服务器宕机或超时响应时,为了防⽌整个系统出现雪崩,暂时停⽌业务服务访问缓存系统
  2. 服务降级:当出现⼤量缓存失效,⽽且处在⾼并发⾼负荷的情况下,在业务系统内部暂时舍弃对⼀些⾮核⼼的接⼜和数据的请求,⽽直接返回⼀个提前准备好的 fallback(退路)错误处理信息。

总结提升

  在实际应用中,缓存击穿、缓存穿透和缓存雪崩是常见的缓存问题,可以通过合理的缓存策略和技术手段来避免或者减轻这些问题带来的影响。

在这里插入图片描述


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

解锁MyBatis Plus的强大功能:学习高级操作与DML技巧!

MyBatisPlus 1,DML编程控制1.1 id生成策略控制知识点1:TableId1.1.1 环境构建1.1.2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤3:运行新增方法 INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置ID步骤3:运行新增方法 ASSIGN_ID策略步骤1:设…

海量数据处理商用短链接生成器平台 - 2

第二章 短链平台项目创建git代码管理开发分层规范 第1集 短链平台实战-Maven聚合工程创建微服务项目 **简介:Maven聚合工程创建微服务项目实战 ** Maven聚合工程拆分 dcloud-common 公共依赖包 dcloud-app FlinkKafka实时计算 dcloud-account 账号流量包微服务 dc…

一分钟了解电脑关机快捷键是什么!

在日常使用电脑的过程中,了解一些基本的快捷键是提高效率的关键之一。其中,电脑关机快捷键是一个方便且迅速的操作,使您可以在不用通过烦琐的菜单操作的情况下,快速关机电脑。在本文中,我们将探讨电脑关机快捷键是什么…

C++初阶:适合新手的手撕string类(模拟实现string类)

上次讲了常用的接口:C初阶:初识STL、String类接口详细讲解(万字解析) 今天就来进行模拟实现啦 文章目录 1.基本结构与文件规划2.构造函数(constructor)2.1构造函数2.1.1无参有参分开2.1.2利用缺省参数合起来 2.2拷贝构…

Pyecharts炫酷散点图构建指南【第50篇—python:炫酷散点图】

文章目录 Pyecharts炫酷散点图构建指南引言安装Pyecharts基础散点图自定义散点图样式渐变散点图动态散点图高级标注散点图多系列散点图3D散点图时间轴散点图笛卡尔坐标系下的极坐标系散点图 总结: Pyecharts炫酷散点图构建指南 引言 在数据可视化领域,…

[C++]:15.继承

继承 一.继承:1.继承的概念和基本操作:1.概念:2.基本操作: 2.继承格式和多种继承方法:1.基本继承格式:2.继承关系访问限定符 3.子类对象和父类对象之间的赋值:1.为什么存在赋值兼容转换&#xf…

第十二篇【传奇开心果系列】Python的OpenCV技术点案例示例:视频流处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例短博文系列短博文目录一、前言二、视频流处理介绍三、实时视频流处理示例代码四、视频流分析示例代码五、归纳总结系列短博文目录 Python的OpenCV技术点案例示例短博文系列 短博文目录 一、前言 OpenCV视频…

程序报错无法打开源文件stdafx.h

在运行代码时,代码中头文件突然报错程序无法打开源文件stdafx.h include “stdafx.h”,编译器就说无法打开源文件,直接上干货解决方法是: 1.打开项目 ->项目属性(最后一个)-> C/C ->常规, 2在附…

golang 创建unix socket http服务端

服务端 package mainimport ("fmt""net""net/http""os" )func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("hello"))})http.HandleFunc("/world", …

【工作周志】240129-240204

本周学习了AXI相关的内容 AMBA (Advanced Microcontroller Bus Architecture) AXI (Advanced eXtensible Interface) ARM公司提出,AMBA3.0协议中重要组成部分,是一种面向高性能、高带宽、低延迟的片内总线…

【c++】vector用法详解

vector用法详解 vector定义vector容器的构造函数vector容器内元素的访问1.通过下标 [ ]来访问2.通过迭代器来访问3.通过范围for来访问 vector常用函数的用法解析1.size()2.clear()3.capacity()4.reserve()5.resize()6.shrink_to_fit()7.pop_back()8.push_back()9.erase()10.in…

python基于django的公交线路查询系统mf383

1.个人信息的管理:对用户名,密码的增加、删除等 2.线路信息的管理:对线路的增加、修改、删除等 3.站点信息的管理:对站点的增加、修改、删除等 4.车次信息的管理:对车次的增加、修改、删除等 5.线路查询、站点查询 …

已解决: ModuleNotFoundError: No module named ‘tensorflow‘ 问题

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

nba2k24 球魁面补【23-24通用】

nba2k24 球魁面补 nba2k23-nba2k24通用 球魁面补 下载地址: https://www.changyouzuhao.cn/9841.html

蓝桥杯省赛无忧 课件91 高斯消元

01 算法概述 02 问题引入 03 算法分析 04 例题

Linux 多线程 | 线程的概念

线程的概念 线程是一个执行分支,执行粒度比进程更细,调度成本更低; 线程是进程内部的一个执行流; 线程是CPU调度的基本单位,进程是承担分配系统资源的基本实体。 之前我们学习过虚拟地址空间的知识,知道…

NetSuite 权限不足用户如何查询完整数据

假设我们做了一个Saved Search,用于统计所有涉及库存的事务类型,包括出入库、库存调整、生产报工、拆解、Standalone Invoice和Bill,等等。通过合计这些事务类型,我们就可以得到一个存货报表,能够得到任一时间点的库存…

第十一讲_JavaScript文档对象模型DOM(二)

JavaScript文档对象模型DOM(二) 1. 事件是什么2. 事件类型3. 添加和移除事件处理器4. 事件对象4.1 事件对象的常用属性 5. 事件流5.1 阻止默认行为5.2 事件冒泡 1. 事件是什么 事件是发生在编程的系统中的事情,当事件发生时,系统…

【.net】缓存操作

类&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Caching;namespace RisunFactoryLibrary {public class CacheHelper{/// <summary>/// 创建缓存项的文件依赖/// </sum…

线程同步解析

一 线程同步 1 同步的意义 现实中抢票可能没票了还在抢票&#xff0c;然后线程就会一直在加锁解锁&#xff0c;就会导致其它线程抢不到锁而产生饥饿问题&#xff0c;我们前面也提过usleep就是让线程被切换&#xff0c;能让其它线程去申请锁&#xff0c;这种方式并不好&#xf…