首页 > 数据库 >Redis的三大常见问题

Redis的三大常见问题

时间:2025-01-20 23:01:18浏览次数:3  
标签:缓存 过期 Redis 布隆 常见问题 Mysql 数据 三大

Redis的三大常见问题

如果是一名能够熟练的将Redis运用到项目中的程序员,那么一定听说过Redis在使用中存在的问题,那么我们今天就来聊聊Redis的三大问题

为什么会有三大问题?

首先,对于很多刚接触Redis的同学,很多时候分不清Redis的作用,不太理解为什么要在SQL之外单独在搞一个Redis出来。

首先,只要接触过Redis,那么你一定知道Redis是用来作为缓存的,但是这只是一句空话,什么叫缓存?为什么要缓存?

什么叫缓存?

通俗的说,缓存就是把部分数据拿出来,然后放到一个地方(缓存区)。别人在查找数据的时候,先去看缓存里有没有数据,如果有,则从缓存区中直接拿,否之再查询数据库。

为什么要缓存

缓存自然有缓存的好处。

众所周知,Redis的数据是存放到内存上的,而Mysql的数据大多数情况是存放在硬盘上的,而总所又周知,内存的存取速度是高于硬盘的,因此缓存就可以提高一次查询的查询速度。

同时,由于Redis的并发处理能力高于Mysql,因此查询数据通过先查询Redis再查询Mysql的形式也能减小Mysql的压力。

除此之外,Redis也经常负责一些不适合/没必要存到Mysql中的数据(比如一些会经常删改的数据,内容较短且较少的数据,或者需要定时过期的数据)

缓存雪崩

场景

在Redis中,我们有时会给一个数据设计一个存储时间,假设在某一时刻,大量的数据同时过期,,而这时因为我们应用的一个高并发,因此导致大量请求直接跨过Redis直达Mysql,这就导致了Mysql的压力过大,甚至可能会导致Mysql的崩溃。

解决方案

自然就是对一些会长期使用的数据不设置过期时间,但同样的这也会导致内存数据的推挤,不过这个问题可以靠升级服务器(money)解决。

缓存穿透

场景

假设有人恶意攻击我们的服务器,那么它可以通过查询一个肯定不存在的数据来造成一个超高的并发量,由于数据不存在,这个数据自然会直接打到Mysql上,进而对Mysql造成极大压力

解决方案

  1. 一旦发现一个空值,就像Redis中添加一个数据,这样就避免了大量的恶意请求,但是与缓存雪崩不同,这个数据的量是无法估计的(恶意请求无限多),因此我们还需要单独设置一个过期时间

  2. 引入布隆过滤器

    布隆过滤器是一种数据结构,用于判断一个数据是否在一个集合当中,布隆过滤器的判断方式保证了若给出结果为不存在则一定正确(不可能有认为不存在的数据存在),若给出结果为存在则不一定正确(可能有一些认为存在的数据不存在)

    在这种情况下,我们先把Mysql中数放存到布隆过滤器中,顺序变为布隆过滤器——>Redis——>Mysql。

    接着我们来看布隆过滤器的处理方案

    若判断为不存在:直接相应请求,且判断一定正确。

    若存在:查询Redis缓存,若没有则查询数据库(注意,由于布隆过滤器不能判定存在可能出错的原因,这里的数据可能是不存在),然后再放到Redis中,再返回数据。

    这里可能已经有小伙伴发现,布隆过滤器解决存在的方案就是1的方案,但是由于有了布隆过滤器的存在,可以进一步减小压力与内存的浪费

缓存击穿

场景

缓存击穿的场景类似于缓存雪崩。

缓存击穿是大量请求请求一个数据,而这一个数据过期。(多*1=多)

缓存雪崩是一些请求(可能不算很多)请求大量数据,而这些数据集体过期(少*少=多)

因此缓存击穿设计的数据往往是热点数据(只有热点数据才会高额请求一个数据)

解决方案

  1. 不设置过期时间解决一切问题

  2. 添加分布式锁

    涉及技术:Lua脚本再Redis中的使用

    对Redis的数据加锁(通过再Redis中使用Lua脚本实现锁功能),保证当缓存失效时只有一个服务实例去数据库中获取数据并更新缓存,进而避免了大量数据进入Mysql。

  3. 引入本地缓存与Redis互补(通俗的说就是再加一层缓存)

    涉及技术:本地缓存(可以使用Google开源的Caffeine)

    顺序:本地缓存——>Redis——>Mysql

    将本地缓存的时间设置为与Redis不同

    1. 都未过期:直接返回
    2. 本地缓存过期Redis未过期:直接从Redis取,放到本地缓存,再返回
    3. Redis过期,本地缓存未过期:直接返回
    4. 都过期:访问Mysql,再放到Redis,再放到本地缓存

    通过这种模式减小了击穿的概率,还可以通过再步骤3将本地缓存同步到Redis,以及涉及多个本地缓存的方式进一步优化减小压力

  4. 热点 Key 探测,延长缓存失效时间

    这种方案是实时判断Redis中哪些中哪些数据是热点数据,再对这些数据进行及时的续签。

    该方案技术难度较大,这里给大家推荐一篇大厂的文章得物技术团队——热点探测技术架构设计与实践

标签:缓存,过期,Redis,布隆,常见问题,Mysql,数据,三大
From: https://blog.csdn.net/weixin_54514490/article/details/145271167

相关文章

  • Redisson
    Redisson是一个基于Redis的Java客户端,提供了丰富的分布式功能,并且对Redis的操作进行了封装,使得开发者可以更方便地使用Redis作为分布式缓存、消息队列、分布式锁等功能的实现工具。Redisson是一个功能强大的开源框架,能够通过Redis实现许多分布式系统常用的特......
  • 2025最新TikTok企业认证申请指南:要求及常见问题
    现如今,TikTok企业认证已成为众多跨境商家在TikTok营销的重要一环。通过获得TikTok的企业认证标识,不仅能增强品牌的官方性和权威性,还能享受更多企业专属权益。那么,如何申请并获得TikTok的企业认证标识呢?以下是2025最新的申请指南,助力你成功认证~一、TikTok企业认证的重要性......
  • 面试题-redis的大key与热key
    题目概览:什么是Redis的大key,多大的键值才算是大key,大key是如何产生的呢?大key会造成什么问题,如何排查以及如何优化?Redis的大Key被发现后如何删除,删除的时候会存在什么难点?说说看Redis的热key吗,热key会造成什么问题,如何解决?1、什么是Redis的大key,多大的键值才算是大key,......
  • 【大模型面试】常见问题及答案,一文搞定面试准备!2025年大模型最新最全面试题,助你吊打面
    大模型相关的面试问题通常涉及模型的原理、应用、优化以及面试者对于该领域的理解和经验。以下是一些常见的大模型面试问题以及建议的回答方式:请简述什么是大模型,以及它与传统模型的主要区别是什么?回答:大模型通常指的是参数数量巨大的深度学习模型,如GPT系列。它们与传统模......
  • Redis(1)基本知识大全
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录简介一、Redis的分类二、Redis的常用命令2.1基本命令2.2字符串相关命令2.3Hash相关命令2.3List相关命令2.4Set相关命令2.5ZSet相关命令简介Redis(RemoteDictionaryServer),即......
  • 前端项目上线过程中的常见问题及解决方案
    在前端项目的上线过程中,经常会遇到各种问题,这些问题可能会导致项目无法正常部署或运行。本文将详细讨论三个常见的问题及其解决方案:问题1:打包时使用 copy-webpack-plugin 引入外部配置文件,但项目发布后拿到的配置文件是错误的问题描述在使用copy-webpack-plugin打包时,虽然......
  • 以太网三大链路类型对比:如何选择Access、Trunk或Hybrid?
    以太网链路类型指的是不同的链路连接模式,这些模式决定了交换机与交换机、交换机与路由器、交换机与终端设备之间如何交换数据。理解这些链路类型有助于优化网络结构,提高数据传输效率,确保网络的稳定性和安全性。在以太网中,链路类型分为三种:Access链路、Trunk链路和Hybrid链......
  • Redis安装
    文章首发在我的博客:https://blog.liuzijian.com/post/62299bca-35ea-4518-99fb-bbe8672021cc.html使用RockyLinuxrelease9.5环境编译安装Redis-7.2.61.下载官方GitHub地址https://github.com/redis下载7.2.6版本源码到服务器cd/optwgethttps://github.com/redis/red......
  • Redis中的热点Key问题及解决方案
    Redis作为常用的缓存解决方案,其性能和稳定性至关重要。然而,在高并发场景下,Redis可能会遇到热点Key问题,即大量请求集中在同一个Key上,导致缓存击穿,影响数据库服务,甚至拖垮整个应用。本文将详细解析热点Key问题的原理、如何发现热点Key以及如何通过多级缓存策略解决这一问题。一......
  • Redis 入门教程:什么是 Redis?如何开始使用?
    Redis入门教程:什么是Redis?如何开始使用?Redis是一个开源的内存数据结构存储系统,广泛用于缓存、消息队列、实时数据处理等场景。它不仅速度快,而且支持多种数据结构(如字符串、哈希、列表、集合等),因此非常适合处理大量实时数据。今天,我们将带你一起快速了解Redis,并教你如何上......