首页 > 数据库 >redis缓存穿透、缓存击穿、缓存雪崩问题与解决方案

redis缓存穿透、缓存击穿、缓存雪崩问题与解决方案

时间:2022-11-08 00:22:53浏览次数:44  
标签:缓存 数据库 redis 访问 雪崩 数据

redis缓存穿透、缓存击穿、缓存雪崩问题与解决方案

redis缓存的使用,极大的提升了应用程序的性能,尤其是数据查询方面,但同时也带来了一些问题的,最主要的是数据一致性的问题,从严格意义上讲这个问题无解,如果对数据一致性要求很高就不能使用缓存。

其次是因为某些特殊情况下,缓存失去了预期的功能,导致流量一下子涌入数据库,有可能导致数据库崩溃,对此种场景又进行了细分便有了缓存穿透、缓存击穿、缓存雪崩三种场景问题

缓存穿透

用户想要查询一个数据,但发现访问数据既不在redis缓存中也没在数据库中。这种数据库中也找不到对应的数据,就不会写入缓存中,缓存也失去了意义,当有人利用不存在的数据去频繁访问,这样会导致查询请求"跳过缓存"直接去访问数据库,会导致数据库的压力增大,甚至崩溃。这种问题就是缓存穿透

解决方案

  1. 布隆过滤器

    布隆过滤器是一种数据结构,将所有可能查询的参数以hash形式存储,如果查询数据在缓存中存在则让其访问缓存,如果不存在则直接拒绝该请求
    
  2. 缓存空对象

    当访问的数据在数据库中也查不到时,返回的空对象也存入缓存中,并且设置一个过期时间,到期后再从访问数据库的结果存入缓存中,平衡数据库的访问量
    

缓存击穿

缓存击穿是指一个key是热点数据,不同用户同时(多并发)访问,并且长时间处理这样的高并发的状态,当这个key失效的瞬间,会导致高并发量的请求直接访问数据库,导致数据库压力增大,甚至崩溃

解决方案

  1. 设置热点数据永不过期

  2. 添加互斥锁

    只让一个线程构建缓存,其他线程等待缓存构建完毕后,重新从缓存中获取结果。单机通过synchronized或者lock来处理,分布式环境采用分布式锁处理
    

缓存雪崩

缓存雪崩是指在某一时间段,缓存中的大量热点数据集中过期失效或者redis缓存宕机,导致请求全部访问数据库,导致数据库压力增大,甚至崩溃

解决方案

  1. redis高可用

    配置redis集群,避免单台redis宕机导致的缓存雪崩问题
    
  2. 限流降级

    在缓存失效后,通过加锁或者队列的形式控制访问数据库的线程数量
    
  3. 数据预热

    在正式部署之前,先把可能访问的数据提前访问一般,这样访问的数据一开始就会加载到缓存中,并且设置key的过期时间是一个随机数,让缓存失效的时间点尽量均匀
    

标签:缓存,数据库,redis,访问,雪崩,数据
From: https://www.cnblogs.com/shenStudy/p/16867966.html

相关文章

  • 闭包小知识:闭包实现数据缓存、变量隔离,以及柯里化的使用场景
    缓存什么是缓存函数?接收一个函数,用闭包将每次函数执行的结果缓存起来缓存例子1: /**闭包实现缓存*属性:有个键--值--->所以可以将缓存数据存放在一个对......
  • 网络协议之:redis protocol 详解
    目录简介redis的高级用法Redis中的piplineRedis中的Pub/SubRESPprotocolSimpleStringsBulkStringsRESPIntegersRESPArraysRESPErrorsInlinecommands总结简介redis......
  • Redis优化神技:如何用更少内存,保存更多数据
      今天跟大家分享一些优化神技,当你面试或者工作中你遇到如下问题,那就使出今天学到的绝招,一招定乾坤! 如何用更少的内存保存更多的数据? 我们应该从Redis是如何......
  • Docker安装Redis
    1.Docker安装Redis方案一:使用docker拉取镜像1、查找DockerHub上的redis镜像dockersearchredis2、拉取官方的镜像,标签为3.2(先创建redis文件夹)dockerpullredis:3.2......
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
    (建议初学者把这个系列前面的都看看,那对于redis的基本使用操作及一些消息的订阅分布都是没问题的了)Redis,一个缓存数据库。不仅仅是能用于对数据的CRUD,也可以作为一个消息中间......
  • 从根上理解Mybatis的一级、二级缓存
    1\.写在前头这篇帖子主要讲一级缓存,它的作用范围和源码分析(本来想把一二级缓存合在一起,发现太长了)2\.准备工作2.1两个要用的实体类publicclassDepartment{public......
  • C# 中使用 Redis 简单存储
    原文网址:https://www.cnblogs.com/timeddd/p/11117787.htmlRedis是一个开源的使用ANSIC语言编写的支持网络、可基于内存也可持久化的日志型、Key-Value数据库。常......
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
    前言 该篇介绍的内容如题,就是利用redis实现接口的限流( 某时间范围内最大的访问次数) 。正文 惯例,先看下我们的实战目录结构:首先是pom.xml核心依赖: <!--用于redis......
  • springboot 集成redis
    1、redisforwindows下载地址: https://how2j.cn/frontdownload?bean.id=1733(注意启动方式)2、使用场景:高频访问的场景:---用户的权限可以放到缓存中设置过期时间(就不......
  • 数据缓存
    文档位置API-数据缓存1.本地缓存将数据存储在本地缓存中指定的key中。会覆盖掉原来该key对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一......