首页 > 数据库 >redis 缓存击穿 缓存穿透 缓存雪崩

redis 缓存击穿 缓存穿透 缓存雪崩

时间:2024-10-17 17:02:11浏览次数:7  
标签:缓存 请求 过期 数据库 redis 访问 雪崩 数据

一、缓存击穿
如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题

解决方案:

  • 互斥锁方案,请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
  • 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;
二、缓存穿透
当大量请求的数据既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法重新构建缓存数据,来响应后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题

解决方案:

  • 非法请求的限制,如果是url参数有问题或者是恶意攻击请求不存在的数据,可以在API 入口处判断求请求参数是否合理,不合理就限制请求;
  • 缓存空值或者默认值,当出现缓存穿透的现象时,可以针对查询的数据,在缓存中设置一个空值或者默认值;
  • 使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在;
三、缓存雪崩
通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。

那么,当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

解决方案:

  • 均匀设置过期时间;
    如果要给缓存数据设置过期时间,应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数,这样就保证数据不会在同一时间过期。

  • 互斥锁;
    当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存

  • 后台更新缓存;
    业务线程不再负责更新缓存,缓存也不设置有效期,而是让缓存“永久有效”,并将更新缓存的工作交由后台线程定时更新。

四、总结
简单来说:
  • 缓存雪崩就是redis中大量key同时过期

  • 缓存击穿就是redis中热点数据的key突然过期,虽然不是大量key同时过期,但是因为是热点数据,请求量也非常大

  • 缓存穿透就是大量请求的数据既不在redis中,也不在数据库中,比如非法访问,黑客攻击,或者url上乱改参数访问等




参考文档:
https://www.zhihu.com/question/421946305

标签:缓存,请求,过期,数据库,redis,访问,雪崩,数据
From: https://www.cnblogs.com/sunjiwei/p/18472420

相关文章

  • Redis 缓存淘汰策略
    一、概述缓存淘汰策略是在Redis达到最大内存限制时,决定哪些数据需要被移除以便为新数据腾出空间的策略。这些策略通过配置文件或命令进行设置,以保证Redis在有限的内存环境下能够平稳运行。二、各种淘汰策略介绍Redis提供了8种淘汰策略,可以分成两大类:1、针对所有键的策......
  • LeetCode LRU 缓存
    题目描述请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intv......
  • redis 持久化策略
    一、redis持久化介绍Redis是个基于内存的数据库,服务一旦宕机,内存中的数据将全部丢失。通常的解决方案是从数据库来重新把这些数据写进redis,但后端数据库有性能瓶颈,如果是大数据量的恢复,会对数据库带来巨大的压力,导致程序响应慢。所以对Redis来说,实现数据的持久化,避免从后端数据......
  • Redis的内存管理体系
    Redis的内存管理体系Redis的内存管理体系由多种策略和机制组成,旨在有效利用内存资源、优化性能和确保数据的可靠性。以下是Redis内存管理体系的主要组成部分:1.内存分配Redis使用自定义的内存分配器,默认使用Jemalloc。这种分配器旨在减少内存碎片,提高内存分配和释放的......
  • 缓存穿透/击穿/雪崩(附生产BUG)
    优质博文:IT-BLOG-CN一、背景为什么要写这篇文章?生产缓存生成服务转java时,需要通过配置文件进行流量切换。开发人员同时打开了两个配置页面。原配置信息=ABCDEF。在第一个配置页面进行缓存切换,添加G业务缓存,配置信息=ABCDEFG。随后H业务也需要进行缓存切换,但开发人员在第......
  • Springboot缓存+定时提交优化频繁数据库表修改
    缘起最近在弄一个答题小程序,当用户选择的时候需要把用户选择的选项提交到服务器上,然后整个字段是个json格式的,更新的方法也就是解析json后添加选项进入json中。于是其中就涉及到频繁的数据库修改,因为用户答题速度根据题目不同嘛,所以我就寻思这样频繁的修改,数据量上来速度就会受......
  • 常见的缓存淘汰算法
    应用场景:缓存淘汰算法可以广泛应用于任何有缓存淘汰需求的场景,并不仅限于某个特定的插件或工具。许多软件和系统,如数据库(Redis、Memcached)、Web服务器(Nginx、Varnish)、内容分发网络(CDN)、浏览器缓存、甚至操作系统的内存管理,都会使用这些算法来决定在缓存空间满时该移除哪些数据......
  • 性能优化实战(三):缓存为王-面向缓存的设计
    如果你觉得这篇文章对你有帮助,请不要吝惜你的“关注”、“点赞”、“评价”、“收藏”,你的支持永远是我前进的动力~~~ 个人收藏的技术大会分享PDF文档,欢迎点击下载查看!!!本文是我在做网易考拉海购性能优化时的真实实践,希望对你也有帮助!!!一、流量走向示意图通常一个请求的......
  • golang redis拼团参团
    用Golang和Redis实现拼团参团功能拼团参团是电商平台上常见的一种促销方式,用户可以通过团购来获得价格折扣。在这篇文章中,我们将使用Go语言(Golang)和Redis来实现一个简易的拼团参团功能。下面让我们一起看一下具体的步骤。流程步骤首先,我们得了解实现拼团的基本流程。以......
  • Redis集群部署(redis主从+哨兵)
    根据项目需要,三台机器搭建一个为redis主从+哨兵的集群,10.10.10.1(举例用的虚拟IP,下同)为主节点,10.10.10.2和10.10.10.3为从节点。1、redis部署准备工作编辑/etc/hosts文件,添加要搭建的三台机器ip跟机器名称)使用hostname查出机器名称。)在三台机器中,加入Redis集群的机器IP及机器......