Redis应用问题及解决

news2024/10/6 4:08:15

目录

一.缓存穿透

        1.1 问题描述

         1.2 解决方案

 二.缓存击穿

        2.1 问题描述

         2.2 解决方案

 三.缓存雪崩

        3.1 问题描述

        3.2 解决方案


        当数据库压力变大,导致服务访问数据库响应变慢,导致服务的压力变大,最终可能导致服务宕机。

一.缓存穿透

        1.1 问题描述

        key对应的数据在数据库中并不存在,每次针对key的请求从缓存中获取不到,于是会请求数据库。当该key的请求很多,会导致数据库的压力变大,从而导致数据库宕机。

        此时缓存还是平稳运行的,但是并没有起到作用。

        比如:用一个不存在的用户id获取用户的信息,不论是缓存还是数据库都不存在该数据。若黑客利用此漏洞进行攻击可能压垮数据库。

         1.2 解决方案

        一个一定不存在的缓存以及查询不到的数据,如果在数据库中找不到数据不写入缓存,则在缓存中找不到数据每次请求都需要到数据库中查询。这将导致缓存失去意义。

  • 对空值进行缓存:如果从数据库中没有查询到数据,返回为空,不管存不存在,我们仍然把这个空值(null)进行缓存,但是设置空值的过期时间很短,不超过5分钟。只能作为临时的方案。
  • 设置可以访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较。如果id不在bitmaps里,进行拦截,不允许访问。
  • 使用布隆过滤器:布隆过滤器的底层也是使用的hash,优点是空间效率和查询时间效率高,缺点是有一定的误识别率和删除困难。
  • 进行实时监控:当发现redis缓存中的命中率急剧降低,排查访问对象和访问数据,和运维人员配合,设置黑名单限制访问。

 二.缓存击穿

        2.1 问题描述

        key对应的数据存在,但是在redis中过期,此时若有大量的并发请求过来,这些请求发现缓存过期,会将请求发送到数据库中,查找到数据后将数据缓存到redis中。这个时候大量的并发请求可能瞬间把数据库击垮。

        同一时间有大量的请求,请求到了redis中过期的数据,请求转发到数据库,大量的请求导致数据库压力过大,导致数据库宕机。

        现象:1.数据库的压力瞬时增加。2.redis中并没有大量的key过期。3.redis正常运行,压力并没有变大。

        原因:1.redis中某个key过期,并且有大量的访问使用到这个key。

         2.2 解决方案

        key可能会在某个时间点被超高并发的访问,是一个非常热点的数据。如果缓存中该key过期了,会导致数据库的压力变大,进而导致宕机,出现缓存击穿问题。

  • 预先设置热门数据:在redis高峰访问之前,把热门数据提前存入到redis里面,并且加大这些热门数据key的过期时长。
  • 实时调整:现场监控哪些热门数据,监控那些数据被频繁访问,实时调整key的过期时长。
  • 使用锁
    • 在缓存失效的时候(判断拿出来的值为空),不是立即去访问数据库。
    • 先使用缓存工具的某些带成功操作返回值的操作(比如:redis的setnx)去set一个mutex key。
    • 当操作返回成功时,在进行请求数据库的操作,并回设缓存,最后删除mutex key。
    • 当操作返还失败时,证明有线程在访问数据库,当前线程等待一段时间再重试整个get缓存的方法。
    • 加锁的缺点会导致效率变低。每次访问数据库只能一个线程去访问。

 三.缓存雪崩

        3.1 问题描述

        key对应数据存在,但是再redis中过期,此时若有大量的并发请求过来,这些请求发现缓存过期一般会将请求发送到数据库中,并且将数据设回缓存,这个时候大量的并发请求会瞬间压垮数据库,导致数据库宕机。

        缓存雪崩和缓存击穿的区别在于,缓存雪崩针对的是很多个key过期,缓存击穿只是针对一个key过期。

        现象:1. 在极短的时间段内,redis中有大量的key过期。

        3.2 解决方案

        缓存失效时的雪崩问题对底层系统的冲击时非常可怕的。

  • 构建多级缓存架构:nginx缓存+redis缓存+其他缓存(echache等)。如果redis不能处理,在其他缓存中查找。
  • 使用锁或者队列:使用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行大量的访问。从而避免失效时大量的并发请求落到底层存储系统上,不适用于高并发的情况
  • 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外一个线程在后台去更新实际key的缓存。
  • 将缓存失效时间分散开:比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分支随机,这样每一个缓存的过期时间的重复率会降,就很难引发集体失效的时间。

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

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

相关文章

Linux编译器——gcc/g++使用

前言: 在上一篇,我们学习了关于文本编辑器 vim 的全部知识,今天给大家带来的是关于Linux编译器—gcc/使用的详细介绍。 本文目录 (一)温习程序的产生的过程 1、前言 2、程序的产生过程 3、🌜初步认识 gc…

深度学习中的算法学习与记忆,利用故事联想帮助大家记忆,每个人都会

大家好,我是微学AI,大家看过我的文章,想必是对深度学习有了一定的了解了,但是对于初学者来说,深度学习中有很多名词和数学知识、原理还是不太清楚,记忆的不牢固,用起来不熟练,今天就…

网络安全 - Web应用防护墙(WAF)

什么WAF Web应用防护墙(Web Application Firewall)简称WAF。是一种特定形式的应用程序防火墙,用于过滤、监控和阻断通过网页服务的HTTP流量。通过监察HTTP流量,它可以防止利用网页应用程序已知漏洞的攻击,例如SQL 注入…

适配器模式C++用法示例

五.适配器模式一.适配器模式1.原理2.适用场景3.代理、桥接、装饰器、适配器区别4.分类(类适配器模式、对象适配器模式)二.C程序示例1.类适配器2.对象适配器一.适配器模式 1.原理 适配器模式的原理是将一个类的接口转换成客户希望的另一个接口。适配器模…

权威认证!腾讯云数据安全中台入选工信部商用密码典型应用方案

近日,工业和信息化部、国家密码管理局发布了《关于公布工业和信息化领域商用密码典型应用方案名单的通知》,腾讯云“基于商用密码的数据安全中台”在众多方案中脱颖而出,成功入选工业和信息化领域商用密码典型应用方案名单。 密码可以实现信息…

在springboot项目中使用rocketmq消息队列实战

rocketmq环境搭建 在docket环境下安装部署rocketmq的方法记录在上一篇文章中。 (31条消息) docker环境下搭建rocketmq集群_haohulala的博客-CSDN博客 这种方式不一定是最好的,但是我用这种方式可以成功搭建rocketmq开发环境。 项目架构 我们需要在springboot中…

CSDN 周赛填空题,充满恶意的嘲讽

CSDN 周赛填空题,充满恶意的嘲讽41期的填空题44期的填空题45期的填空题再说题型老顾最近一直在玩 csdn 周赛,没啥想法,就是想票点小玩意,之前从第四十一期开始,题型进行了扩展,增加了填空、判断、单选。扩展…

C#调试与测试 | Assert(断言)

Assert(断言) 文章目录Assert(断言)前言什么是Assert适用场景使用示例检查传入的参数是否为空检查循环变量是否在规定范围内检查方法返回值是否为null结束语前言 今天我要和大家聊聊C#调试和测试中的一种神器——断言(Assert)。如果你还不知道什么是断言…

nvm-windows的安装使用及踩坑指南

nvm是node的一款版本管理工具,可以简单操作node版本的切换、安装、查看。常规来说,开发中安装一个node版本就够了,但是最近在开发中有的老项目或者一些特定的项目需要来回切换node的版本,不可能手动去卸载掉之前的node版本&#x…

轻松掌握微服务治理的注册中心Eureka到Nacos知识点

1、SpringCloud 1、介绍 2、消费者与服务者 3、服务拆分 1、介绍 2、服务之间调用 例如有两个微服务,分别提供用户信息和订单信息。两个服务都有自己的数据库,所以如下查订单信息是不能直接去查用户信息的数据库的,只能从订单服务发起远程…

Seata 将参展 SOFA 五周年开源集市~

SOFA 五周年开源集市4 月 15 日(本周六),SOFAStack 社区将在北京市朝阳区恒通国际创新园 C work 举办开源五周年活动,现场将于 12:00 正式开放开源集市,欢迎感兴趣的开发者们前来参与。今天让我们一起走近认识下开源的…

上海雷卯推出DFN1006超小体积网口保护ESD ULC0342P26LV 带回扫

什么是静电放电? 静电放电是指由于两种不同材料之间的摩擦或分离而产生的电荷累积所引起的电荷释放现象。 为什么需要防静电保护? 静电放电会对电子设备造成损害,特别是对于灵敏的网络设备来说,静电放电可能导致设备损坏或失效。…

图卷积网络GCN---底层逻辑最简单直白的理解

一 、GNN是怎么被提出来的? 比较常见的有CNN、RNN等。CNN的核心在于它的kernel,kernel在图片上平移,通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性:一个小窗口无论移动到图片的哪一个位置,其内部的…

Elk运维-elastic7.6.1集群安装部署

wei集群安装结果说明 实例配置安装软件安装账号hadoop1 2C4G 磁盘:50G 云服务器 elasticsearch kibana rdhadoop2 2C4G 磁盘:50G 云服务器 elasticsearchrdhadoop3 2C4G 磁盘:50G 云服务器 elasticsearchrd整个安装过程使用的账号&…

linux(docker)下使用VuePress从零开始搭建自己的博客(一):VuePress环境搭建

目标:在linux centos下使用VuePress搭建博客系统,最好能利用docker进行备份和迁移。 本节内容:本节主要讲述VuePress的环境搭建过程,VuePress的基本配置以及备份和迁移。详细记录了从零开始搭建的过程,以及搭建过程中遇…

Apache配置与应用

1.基于域名的虚拟主机 为虚拟主机提供域名解析 基于域名:为每个虚拟主机使用不同的域名,但是其对应的 IP 地址是相同的。例如,www.benet.com 和 www.accp.com 站点的 IP 地址都是 192.168.80.10。这是使用最为普遍的虚拟 Web 主机类型。 方法…

【Java Web】015 -- Maven高级(分模块设计与开发、继承与聚合、私服)

目录 一、分模块设计与开发 1、为什么要分模块设计? 2、实践:分模块开发 ①、实现步骤 3、小结 二、继承与聚合 继承 1、继承关系 ①、为什么要在Maven工程中实现继承? ②、继承关系实现 ③、继承实现小结 ④、maven项目父子工程结构说明 2、…

Java Stream API 操作完全攻略:让你的代码更加出色 (二)

前言 Java Stream 是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面,包括 red…

WMS仓库管理系统,你能操作明白吗?别让"智能"变"滞能"

随着社会的进步,智能车间、智能工厂等申报的展开,“智能化”的概念,让企业系统出现更迭。以智能化仓储管理系统为例,企业工厂利用WMS的优势,依照运行的工作标准和运算法则,对仓库进行精细化管理。 WM…

IC学习笔记22——memory_compilermemory_wrapper

一、memory_compiler 1.1 memory_compiler的介绍 memory_compiler为一系列工具的统称,用于生成芯片开发所需要的memory。芯片开发中所需要的memory为sram、rom等。很多公司都有自己开发的memory_compiler工具。 1.2 SRAM基础 sram写操作(写1) 将要写入的数据“1”通过写入…