【Redis】Redis 高并发常见问题

news/2024/5/8 8:23:03/文章来源:https://blog.csdn.net/sinat_36645384/article/details/130343771

目前市场上许多软件产品,其内部都采用 Redis 作为数据缓存的主要解决方案。随着业务的不断发展,在高并发场景里,Redis 常常会出现一些问题,网络上也有很多文章对其做出了总结。这里主要针对 缓存穿透、缓存雪崩、缓存击穿 这几类场景进行分析,并提出可能的处理方案。需要强调的是,以下的分析仅供参考,具体决策和实现效果必须要结合具体的业务场景,实事求是地进行应用

缓存穿透

缓存穿透指的是客户端向服务端请求 Redis 缓存和数据库中不存在的数据,导致所有的请求都穿透缓存处理阶段,直接打到数据库上。如果短时间内请求非常很多,数据库就会承受极大的压力。

发生 Redis 缓存穿透的场景可能会有以下几种:

  • 热点数据采用懒加载。用户正常发起请求,但由于缓存中没有数据,而数据库中有数据,导致短时间内大量请求同时访问数据库,造成数据库压力过大。

  • 数据库中有数据,且数据已经被缓存起来。用户正常发起请求,但恰好缓存中的数据过期了,从而导致大量请求同时访问数据库,造成数据库压力过大

  • 用户恶意发起大量请求,查询缓存和数据库中都不存在的数据,导致每次请求都要到数据库中查询,造成数据库压力过大。

针对上述情况,有以下解决方法可供参考:

  1. 参数校验。

    后端开发独立服务接口时,需要基于服务本身,对接口的请求入参做严格的校验和准入控制。对于不合理的请求参数,可适当 return null 或者空对象结束当前流程。对于后端来说,要有互不信任原则,毕竟无法确保用户或对接的业务方一定会严格按照接口设计传入安全的参数。

  2. 临时缓存。
    对于数据不存在的请求参数,也将其 key 与结果短暂缓存起来,这样能避免大量相同请求瞬间打到数据库上,减轻压力。但这种方式也只是缓解请求压力而已,之后还是要从根本上分析解决问题。如果是存在恶意访问的用户特征,则可以在网关层限制这些用户的请求。

  3. 热加载缓存。

    采用数据预热的方式。在可预见的大量请求到来之前,我们可以通过手动或者定时任务的方式,将相关的数据批量写入到 Redis 缓存中,这样就可以避免大量的基础数据请求直接打到数据库上,从而减轻数据库的读写压力,间接保护了数据库。

  4. 拦截请求。

    可使用 Redis 自带的布隆过滤器,让它维护所有合法的 key,多次接收到不合理的请求时,则主动拦截请求。这种方案有一定的误差,但在大量的请求中,能有效地过滤掉绝大多数异常的请求。关于布隆过滤器的介绍,可以参考这篇文章:布隆过滤器(Bloom Filter)原理解析

对于临时缓存空数据以及布隆过滤器两种方案的对比,可以参考这篇文章:【Redis】Redis 高并发处理策略

缓存雪崩

缓存雪崩是指缓存数据的过期时间过于集中,在缓存同一时间大面积失效的情况下,大量请求涌入数据库,导致数据库无法承受而崩溃的现象。

可采用的解决方案如下:

  1. 给缓存过期时间加随机时间

    在缓存过期时间基础上加上一个随机时间,使缓存过期时间散列开,避免缓存集中失效,有效防止缓存雪崩问题。但是,随机时间的设置需要合理,过长或过短都会对性能和缓存的使用效果产生负面影响。

  2. 加互斥锁

    互斥锁可以保证同一时间只有一个请求可以访问数据库进行数据缓存,避免了大量请求同时访问数据库。但是,这种方法会导致系统的吞吐量明显下降,需要根据实际业务来决定是否使用。

  3. 热点数据不设置过期时间

    热点数据不设置过期,请求可以一直获取到缓存的数据。但在这种情形下,用户请求不能确保获得的结果一定就是与数据库内容完全一致,这就涉及到一个数据一致性的问题。在某些业务场景下,还需要运维人员手动实现数据同步,保证缓存数据的正确性。

总而言之,缓存雪崩问题需要根据实际业务进行调整,不同业务的处理方式也不尽相同。在设置缓存过期时间时,需要合理设置随机时间,并根据业务需求来决定是否加入互斥锁。

缓存击穿

缓存击穿是指缓存的热点 key 过期或被删除后,导致线上原本能命中该热点 key 的请求,瞬间大量地打到数据库上,最终导致数据库被击垮。

可能导致缓存击穿的一些原因有:

  1. 热点 key 过期。缓存 key 过期,缓存数据查询失败,请求全都打到数据库上。
  2. 业务误操作。如果应用程序在处理数据时出现了误操作,例如错误地删除了缓存中的数据,就可能导致缓存击穿。
  3. 缓存设置不合理。如果应用程序缓存的数据量过大,或者缓存的数据类型与访问的数据类型不匹配,就可能导致缓存击穿。
  4. 黑客攻击:如果黑客攻击了应用程序的缓存,例如篡改了缓存数据,就可能导致缓存击穿。

应用程序开发人员需要根据实际情况进行排查,找出具体原因,及时进行解决。同时,应用程序开发人员还可以通过优化应用程序算法和缓存策略等方式来预防缓存击穿问题的发生。

可以采取以下防范措施防范缓存击穿问题:

  1. 及时维护缓存 key 和数据:缓存数据过期前及时更新缓存数据以及重置缓存 key 的过期时间,确保线上请求能够命中正确的 key 且拿到正确的数据。
  2. 加强权限管理:对线上请求的权限进行严格审核,避免误操作导致数据库崩溃。
  3. 优化数据结构:对数据结构进行优化,减少数据库被频繁访问的情况,提高缓存的命中率。
  4. 监控和预警:对线上请求和数据库操作进行实时监控和预警,及时发现问题并采取相应的措施,防止故障扩大化。

与缓存击穿相比,缓存雪崩指的是多个缓存失效导致的数据库接收请求过多的场景,而缓存击穿指的是单个缓存失效的场景。两者的处理思路可以互相参考。

Redis 服务可用性

缓存是 Redis 的一种,为了提高 Redis 的可用性,可以采取以下措施:

  1. 设置合理的过期时间。设置热点数据的过期时间,确保线上请求能够命中正确的 key。
  2. 加强权限管理。对线上请求的权限进行严格审核,特别是热点数据的访问权限,避免误操作导致数据库崩溃。
  3. 减少对缓存的依赖。对于热度非常大、访问频率非常高的数据,可以考虑在程序中加上本地缓存,比如 HashMap、List 等。
  4. 使用集群架构或主从 + 哨兵,提升保证 Redis 的可用性,如果主从挂了,可以自动将故障转移到备用主机上。
  5. 业务降级。从保护下游(接口或数据库)的角度考虑,针对大流量场景可以进行限流,这样即使缓存崩了,也不至于把下游服务给打挂。
  6. 降级开关和降级逻辑:提前写好降级开关和降级逻辑,关键时候执行降级方案,保证服务的正常进行。

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

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

相关文章

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型,提高会议沟通效率。使用此模型,主要是有三步: 第一步:倾听,项目经理需要保持中立的立场,不先表态,让团队成员畅…

SAP ABAP 使用SICF发布HTTP API接口

一、SE24创建类:Z_HCX_HTTP 1、创建类: 2、切换到接口(interface)页签,输入IF_HTTP_EXTENSION ,回车。切换到方法(method)页签,双击IF_HTTP_EXTENSION~HANDLE_REQUEST进…

STM32 产生随机数方式

STM32 产生随机数方式 C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数,可以配合产生伪随机数。其中srand(seed)产生算法种子,再由rand()通过算法产生随机数,产生的随机数在宏定义RAND_MAX范围内。如果seed不变,则产…

URL 转为QR code(二维码)

推荐一个良心的网站,能够免费地将url、text编码为二维码,而且还能设计logo、颜色等。 https://www.the-qrcode-generator.com/ 如下图: 可以自己定义logo、颜色: 还能查看扫描历史等统计信息: 上述所有功能都是免…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频,如下图所…

VGG网络与中间层特征提取

1. 背景 VGG是常见的用于大型图片识别的极深度卷积网络, 这里主要介绍VGG网络预测在ImageNet数据集上的训练及预测。 2. ImageNet图像数据集简介 ImageNet包含了145W张224*224像素的三通道彩色图像数据集,图像划分为1000个种类。其中训练集130W张&…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者:David Hope 在最近的一篇博文中,我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面,我们将介绍你需要做些什么来扩展你的部署,这样你就可以开始免费从应用程序性能监控(APM)或跟踪集群…

可算是熬出头了,测试4年,费时8个月,入职阿里,涨薪14K

前言 你的努力,终将成就无可替代的自己。 本科毕业后就一直从事测试的工作,和多数人一样,最开始从事点点点的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态。 一年半…

为什么你永远不应该在CSS中使用px来设置字体大小

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。 在Josh Collinsworth的博客文章“永远不要用px作为字体大小”中,作者讨论了为什么不…

Ceph入门到精通-Ceph 编排器简介

第 1 章 Ceph 编排器简介 作为存储管理员,您可以将 Ceph 编排器与 Cephadm 实用程序搭配使用,能够发现设备并在 Red Hat Ceph Storage 集群中创建服务。 1.1. 使用 Ceph Orchestrator Red Hat Ceph Storage Orchestrators 是经理模块,主要…

C语言函数大全-- o 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- o 开头的函数 1. obstack_init,obstack_free,obstack_alloc,obstack_blank,obstack_grow 1.1 函数说明 函数声明函数功能void obstack_init(struct obstack *obstack_ptr);它是 POSIX …

TypeScript自学笔记

目录 1.什么是Ts? 1.1 设计公司:微软 1.2 TS概述 1.3 TS是静态类型 JS是动态类型 1.4 TS是强类型语言 JS是弱类型语言 2.TypeScript编译器 2.1 安装 2.2 TS自动编译和编译选项设置 3.TS的数据类型 3.1 基础数据类型number、string、boolean 3.2 Arrays&a…

美颜sdk开发实践:如何构建美颜sdk功能?

美颜功能是现今很多应用中必不可少的一项功能。而要实现美颜功能,除了自己编写美颜算法外,还可以使用美颜sdk来实现。本文将介绍如何从零开始构建美颜功能,利用美颜sdk实现美颜效果。 一、简介 美颜sdk可以向用户提供多种美颜效果&#xff…

大学生用什么蓝牙耳机好?2023好用的蓝牙耳机推荐

近几年,蓝牙耳机市场不断扩大,逐渐取代有线耳机成为最受人欢迎的数码产品之一。作为蓝牙耳机主要受众群的大学生,用什么蓝牙耳机比较好呢?下面,我来给大家推荐几款便宜好用的蓝牙耳机,一起来看看吧。 一、…

stm32读写内部Flash

stm32内部flash地址架构映射 因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。 主存储器 一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它…

生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例

在计算机网络中,为了保证网络拓扑结构的稳定性和可靠性,需要采用一些协议进行网络的管理和控制。其中,STP、RSTP 和 MSTP 是三种常用的网络管理协议。本文将分别介绍这三种协议,并且使用华为、思科两家厂商作为案例给出相应的命令…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …

【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

在学习的时候找到几个十分好的工程和个人博客,先码一下,内容都摘自其中,有些重难点做了补充! 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

unity3d---物体加点击事件

目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 2d…

6. 树的入门

6. 树的入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 6.1 树的基本定义 …