【Redis缓存架构实战常见问题剖析】

news2024/10/7 4:30:48

文章目录

  • 一、Redis缓存架构实战剖析
    • 1.1、大规模的商品缓存数据冷热分离机制
    • 1.2、缓存击穿导致线上数据压力暴增解决方案
    • 1.3、缓存穿透及其解决方案剖析
    • 1.4、突发性的热点缓存数重建导致系统压力暴增问题分析
    • 1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析
    • 1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析

一、Redis缓存架构实战剖析

1.1、大规模的商品缓存数据冷热分离机制

我们都知道,缓存的内存资源是有限的,例如像jd、tb等大平台的商品信息,商品信息都是很多的,不可能是将所有的商品数据都缓存,那应该缓存那些数据,结合生活中的实际问题,需要缓存的数无非就是经常被大众点击查看或者购买的商品,那我们在对资源进行缓存时,会给其数据设置一个过期时间,如果时间过了都没被访问,那就需要从缓存中移除==>我就是冷数据,如果是被访问了,我们需要将当前数据的过期时间重新更新,延长其过期时间,保证这种经常被访问的数据属于长时间不过期的数据,也就是热数据,这样子我们就可以将不同访问频率的数据区分开来
在这里插入图片描述

1.2、缓存击穿导致线上数据压力暴增解决方案

在对这个问题解决之前:首先我们需要先知道,什么是缓存击穿?产生的原因是什么?
缓存击穿,也称为缓存失效,主要是指由于大批量的缓存在同一时间失效,可能导致大量的请求穿透缓存访问到数据库上,导致数据库的压力暴增甚至导致数据库挂掉,我们就称这种现象为缓存击穿

其解决方案主要是从产生问题的原因入手,我们可以调整批量导入的不同数据的缓存时间,例如,在设置不同key数据时,以基底时间+随机生成的时间,来避免同一时间大批量的缓存数据失效问题,如下图示:
在这里插入图片描述

1.3、缓存穿透及其解决方案剖析

缓存击穿,主要是指客户端查询一个不存在数据(Redis和数据库都不存在),缓存不会命中,数据库也不会命中,从而导致大批量的数据访问到数据库层,导致数据库的压力倍增,那产生这种问题的原因是多方面的,例如:写的业务代码逻辑出问题、平台被恶意攻击等

解决方也是多方面的,主要有:
1、缓存空对象:我们在访问某个key时,如果Redis和数据库都查询不到数据,那我们就可以在Redis中缓存一个空对象信息,如果下次同样的key再次访问,就可以直接在Redis中获取且返回即可,当然,我们还需要考虑恶意攻击的,以不同的key来大量访问,那我们在上一步设置key时,加入一个缓存数据过期时间,类似空对象的数据,过期时间我们不用设置太长时间即可,如下图示:

在这里插入图片描述

2、使用布隆过滤器:对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。

1.4、突发性的热点缓存数重建导致系统压力暴增问题分析

这张突发性的热点缓存数据,主要的场景为,例如:大V直播带货,可能介绍的商品之前属于三不问商品,好东西没被发掘,在直播大V介绍一通后,涌入一大波人对该商品进行查看以及购买等操作,那这时,Redis是无此商品信息的,大量的请求全打到数据库上,导致数据库压力暴增,甚至宕机等,针对这个问题,我们需要对该商品数据进行缓存数据重建,如何重建?我们这采用的双重校验机制===>过程为先从缓存中拿数据,如果拿不到数据,就利用分布式锁加锁(可优化,结合业务场景采用分段锁或读写锁方式),加锁模块中,再重新到Redis缓存中拿数据,如果拿不到,就需要到数据库读取数据,同时缓存数据到Redis缓存中,以便下次其他线程拿数据时,不用到数据库中拿数据,如下图:
在这里插入图片描述

1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析

出现这个问题的主要原因是因为在大并发场景下,一个线程向数据库写数据,正打算往Redis缓存中同步数据时,另外的线程吧数据库的数据改了,例如:A线程将数据库数据改为:10,正准备将10同步到Redis,这个过程中被线程B打断,将数据库的数据改为6,然后A线程将Redis的数据改为10,这样子就导致了数据库与缓存数据双写不一致问题,如下图:
在这里插入图片描述
解决方案主要为,在这个操作的过程中加锁,例如线程A操作时,需要将数据库写入数据与缓存更新这个过程加一把分布式锁即可

1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析

缓存雪崩主要是指,当Redis服务支撑不住宕机后,很大流量就打到后端的储存层,储存层也支撑不住如此巨大流量,进一步演化到后端服务崩盘,前端同时有可能也崩盘,导致整个服务崩盘的过程就称为缓存雪崩,解决类似问题,我们可以从以下方面着手:
1、设置缓存集群RedisCluster或者哨兵Sentinel机制
2、进行服务降级以及熔断操作,比如使用微服务中的流量防卫兵Sentinel或Hystrix等

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

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

相关文章

R | R包安装报错-github连接速度慢或无法访问 | metaboanalystR | Retip | rJava安装

R | R包安装报错-github连接速度慢或无法访问 | metaboanalystR | Retip | rJava安装 一、metaboanalystR 安装1.1 Bioconductor报错,无网络连接1.2 github520-修改hosts文件 二、retip安装2.1 rJava包加载报错及安装2.2 安装Retip包 三、从Bioconductor安装Rdisop报…

【MySQL数据库】| 索引以及背后的数据结构

🎗️ 主页:小夜时雨 🎗️ 专栏:MySQL数据库 🎗️ 如何优雅的活着,是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识 概念 索引是一种特殊的文件,包含着对数据表里所有…

3D模型格式转换工具HOOPS Exchange如何获取模型的特征树?

Tech Soft 3D致力于用无与伦比的技术推动创新,并很高兴为Oracle、SIEMENS、Hexagon Matrology和Stratasist,提供用最快、最准确的数据转换工具包获取CAD数据。 HOOPS Exchange允许开发团队轻松构建,通过单一接口将CAD数据转换为30多种文件格…

Docker - 安装常用服务

Docker - 安装常用服务 防火墙 对外开放访问,需要开放指定的端口提供对外访问 # 防火墙状态 systemctl status firewalld # 开启防火墙 systemctl start firewalld # 关闭防火墙 systemctl stop firewalld# 开放端口 firewall-cmd --zonepublic --add-port10002/…

【React入门实战】实现Todo代办

文章目录 效果功能-状态管理相关接口定义相关方法定义 UIinput输入框:回车添加todo标题列表列表项Main 总体代码 非常简单入门的react-todo练习,代码写的很小白。 效果 技术栈:react-typeScript 数据分为代办Todo和已办完Done,可…

C#,数值计算——函数计算,Dfridr的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 通过Ridders的多项式外推方法返回函数func在点x处的导数。 /// 输入值h作为估计的初始步长&#xff1b;它不需要很小&#xff0c;而是应为x上的增量&#xff0c; /// 在此增…

springboot,spring框架返回204 status code的时候,会吞掉返回值

背景 发现有个有意思的现象&#xff0c;就是当你的接口返回204的 HTTP status code 的时候&#xff0c;会自动把 response body 吃掉&#xff0c;即使代码里是有返回的。例如 &#xff08;其实204本身就是NO_CONTENT的意思&#xff0c;不过我是真没想到真干掉了返回&#xff0…

Spring6学习笔记01

一、课程简介 Spring框架是一款极其优秀的轻量级开源框架&#xff0c;为了解决企业应用开发的复杂性而出现。Spring框架的用途不仅仅限于服务器端的开发&#xff0c;从简单性、可测试性和松耦合性角度而言&#xff0c;绝大部分Java应用都可以从Spring中受益。Spring框架凭借其…

Linux Hadoop平台伪分布式安装

Linux Hadoop 伪分布式安装 1. JDK2. Hadoop3. MysqlHive3.1 Mysql8安装3.2 Hive安装 4. Spark4.1 Maven安装4.2 Scala安装4.3 Spark编译并安装 5. Zookeeper6. HBase 版本概要&#xff1a; jdk&#xff1a; jdk-8u391-linux-x64.tar.gzhadoop&#xff1a;hadoop-3.3.1.tar.gzh…

JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)

1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…

v-calendar 日历组件使用自定义提示内容

目录 0.介绍 1.安装v-calendar 2.页面使用 3.使用插槽实现待办数量的标记 0.介绍 最近项目中用到了日历插件&#xff0c;需要统计每天的任务数量&#xff0c;类似elementui的badge组件&#xff0c;待办任务数量 大概最后的效果如下图所示&#xff0c;右上角把代办任务数量…

php 二分查询算法实现

原理&#xff1a;二分查找算法&#xff08;Binary Search&#xff09;是一种针对有序数组的查找算法。它的原理是通过将查找区间逐渐缩小一半来快速定位要查找的目标值。 应用场景&#xff1a; 数据库或文件系统索引查找&#xff1a;在数据库或文件系统中&#xff0c;索引是有…

基于springboot 停车场管理系统-计算机毕设 附源码 39315

spring boot停车场管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。…

【C++数据结构】顺序存储结构的抽象实现

文章目录 前言一、目标二、SeqList实现要点三、SeqList函数实现3.1 get函数3.2 set函数3.3 insert函数带2个参数的insert带一个参数的insert 3.4 remove函数3.5 clear函数3.6 下标运算符重载函数无const版本const版本 3.7 length函数 总结 前言 当谈到C数据结构时&#xff0c;…

97 只出现一次的数字

只出现一次的数字 题解1 异或的应用&#xff08;判断出现次数是奇偶&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题…

PCIe寄存器之二

关键字索引&#xff1a; CAP_PM 对应&#xff1a;Capabilities: [c0] Power Management CAP_MSI 对应&#xff1a;Capabilities: [c8] MSI CAP_MSIX对应&#xff1a;Capabilities: [e0] MSI-X CAP_EXP 对应&#xff1a;Capabilities: [70] Express (v2) Endpoint 以上 [] 内的…

开设自己的网站系类03安装数据库(centos版)

编者买了一个服务器打算自己构建一个网站&#xff0c;用于记录生活。网站大概算是一个个人博客吧。记录创建过程的一些步骤。 前面已经讲过配置服务器的程序运行环境 网站运行还需要数据库&#xff0c;本篇文章则是安装数据库的内容。 卸载mariadb 查看是否有安装 mariadb&…

【Python】数据分析案例:世界杯数据可视化

文章目录 前期数据准备导入数据 分析&#xff1a;世界杯中各队赢得的比赛数分析&#xff1a;先打或后打的比赛获胜次数分析&#xff1a;世界杯中的抛硬币决策分析&#xff1a;2022年T20世界杯的最高得分者分析&#xff1a;世界杯比赛最佳球员奖分析&#xff1a;最适合先击球或追…

【C语言基础】近期所学到的函数以及关键字(函数memset、scanf、关键字staric、 inline、volatile)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

python核心编程速记【笔记迁移】

笔记速记 1.python非常注重缩进&#xff0c;这是它的显著特征之一。 2.import相当于头文件声明模块。 3.利用type函数 type(a)可以查看当前变量类型。 isinstance可以比较两个数据类型并返回一个布尔值。 4.这里面的可直接使用and和or作为一个函数 5.python的算法比较贴合…