当前位置: 首页 > news >正文

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(退路)错误处理信息。

总结提升

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

在这里插入图片描述


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

相关文章:

  • Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据
  • 学习好并用好大模型
  • 【Cocos入门】场景切换(loadScene、preloadScene)
  • nginx slice模块的使用和源码分析
  • jmeter-06常用的几种断言方式
  • PdfFactory Pro软件下载以及序列号注册码生成器
  • Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中
  • vue 引入 百度地图API 和 路书
  • 功能强大的国外商业PHP在线教育系统LMS源码,直播课程系统
  • K8S之运用亲和性设置Pod的调度约束
  • 在centos7中利用pybind11构建C++的动态库供python调用
  • 初始web服务器(并基于idea来实现无需下载的tomcat)
  • Flink实战六_直播礼物统计
  • CTFshow web(命令执行 41-44)
  • yarn/npm certificate has expired
  • @jsonView过滤属性
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 78. Subsets
  • android图片蒙层
  • CSS相对定位
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript HTML DOM
  • JavaScript的使用你知道几种?(上)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java小白进阶笔记(3)-初级面向对象
  • Protobuf3语言指南
  • vue 个人积累(使用工具,组件)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聊聊flink的BlobWriter
  • 前端相关框架总和
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 一个完整Java Web项目背后的密码
  • 自制字幕遮挡器
  • #Linux(帮助手册)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (windows2012共享文件夹和防火墙设置
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)springcloud实战之config配置中心
  • (分布式缓存)Redis分片集群
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三十五)大数据实战——Superset可视化平台搭建
  • (五)关系数据库标准语言SQL
  • (转)jdk与jre的区别
  • (转)setTimeout 和 setInterval 的区别
  • (转)编辑寄语:因为爱心,所以美丽
  • .NET gRPC 和RESTful简单对比
  • .net mvc 获取url中controller和action
  • .net和jar包windows服务部署
  • .net流程开发平台的一些难点(1)
  • /var/lib/dpkg/lock 锁定问题
  • @EventListener注解使用说明
  • [ NOI 2001 ] 食物链
  • [04]Web前端进阶—JS伪数组
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存