首页 > 数据库 >2023-06-23:redis中什么是缓存击穿?该如何解决?

2023-06-23:redis中什么是缓存击穿?该如何解决?

时间:2023-06-23 21:44:06浏览次数:39  
标签:缓存 06 请求 23 过期 击穿 redis 互斥 数据

2023-06-23:redis中什么是缓存击穿?该如何解决?

答案2023-06-23:

缓存击穿是指一个缓存中的热点数据非常频繁地被大量并发请求访问,当该热点数据失效的瞬间,持续的大并发请求无法通过缓存获取到数据,而直接访问数据库,这就好像在一个稳固完好的容器上打开了一个洞。

解决缓存击穿问题的方法包括:

1.设置热点数据永不过期:将热点数据的缓存过期时间设置为较长的时间,甚至是永不过期。这确保即使缓存失效,该数据仍然可用,从而绕过了缓存击穿的问题。然而,这种方法可能导致缓存数据过期不及时的问题,使得数据不够及时和准确。

2.使用互斥锁(Mutex):在数据失效时,当有新请求到来时,可以通过设置互斥锁来保护数据库访问过程。如果某个请求已经获取到了锁,其他请求则需要等待,直到获取到锁为止。这样可以避免大量并发请求同时访问数据库,减轻数据库的压力。然而,使用互斥锁可能导致并发性能下降和请求等待时间增加的问题,需要权衡考虑。

使用互斥锁

业界常用的做法是使用互斥锁(Mutex)。简单地说,当缓存失效时(即获取的值为空),不会立即去从数据库加载数据,而是通过缓存工具的某些带有成功操作返回值的方法(例如Redis的SETNX)来设置一个互斥锁键(Mutex Key)。如果该操作返回成功,表示当前线程获得了互斥锁,然后可以继续执行加载数据的操作,并将数据回写至缓存;否则,它将重试整个获取缓存的方法。

伪代码如下图:

image.png

永远不过期

这里的“永远不过期”包含两层意思:

(1) 在Redis等缓存工具中,确实可以将某些热点key的过期时间设置为永不过期,即不设置过期时间。这样可以确保热点数据在缓存中一直存在,避免了热点key过期的问题,实现了“物理”不过期。

(2) 为了保证缓存的实时性和更新能力,虽然在"物理"上不过期,但可以将过期时间的信息存储在key对应的value中。当发现数据即将过期时,可以通过后台的异步线程来进行缓存的构建或更新,这样实现了"逻辑"过期。这样的策略能够确保缓存在一定时间内保持有效,并在过期前进行更新,使数据保持最新。

从实际应用的角度来看,这种缓存策略对性能非常友好。它唯一的缺点是在构建缓存期间,其他线程(非构建缓存的线程)可能访问到旧的数据。然而,对于一般的互联网应用功能而言,这个问题是可以容忍的。

标签:缓存,06,请求,23,过期,击穿,redis,互斥,数据
From: https://www.cnblogs.com/moonfdd/p/17500243.html

相关文章

  • 【题解】AtCoder-ABC306G Return to 1
    这也太强了!容易想到的是用若干环拼出这个\(10^{10^{100}}\),也就是这些环的\(\gcd\mid10\)。之后就不会了。先正图反图两次DFS,只留下\(1\)所在强连通分量里的边,对正图跑DFS生成树,定义其深度从\(0\)开始,然后有一个结论是:对于任何正整数\(a\),图中存在一个包含\(1\)......
  • WordPress开启Nginx Redis Cache缓存 解决FastCGI Cache内网穿透兼容问题
    本文转载自:WordPress开启NginxRedisCache缓存解决FastCGICache内网穿透兼容问题更多内容请访问钻芒博客:https://www.zuanmang.net上回说到,Wordpress配合NginxFastCGICache缓存可以极大提升速度体验,但钻芒博客由于是通过Nginx反向代理所以使用起来纯在一定兼容问题,比如缓......
  • 阿里云企业邮箱免费版申请入口最新2023
    本文转载自:阿里云企业邮箱免费版申请入口最新2023更多内容请访问钻芒博客:https://www.zuanmang.net最近因为申请通配符ssl需要验证域名邮箱,腾讯企业邮之前已经有域名占用在用了,找了一圈阿里的入口都消失了,经过不懈努力找到了目前可用的免费版企业邮箱申请入口。在博客分享给大家......
  • 2023年最新5000道校招常用编程面试题分享(附详细题解)
    截止到2021年最新,本资源整理了近5000道校招常用面试题,并附带详细的解题思路及代码,包含leetcode,校招笔试题,面试题,算法题,语法题。持续更新中。。。目录内容截图......
  • 自学C语言2023_6_23
    字符串:字符串——一串字符,用双引号括起的一串字符(字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容)  字符数组:字符数组——数组是一组相同类型的元素  求字符串长度:利用strlen函数求字符串长度: 转以字符:转义字符—......
  • 2023 跟我一起学设计模式:命令模式
    命令模式亦称:动作、事务、Action、Transaction、Command命令模式是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。问题假如你正在开发一款新的文字编......
  • redis基础
    1. 什么时redis  1Redis是一个基于内存的key-value结构数据库。●基于内存存储, 读写性能高●适合存储热点数据( 热点商品、资讯、新闻)●企业应用广泛2. redis入门   22.1 redis简介  2Redis is an open source (BSD licensed), in-memory data structure st......
  • lightdb 23.2新特性一览
    lightdb将于2023.6.30发布23.2版本,下面我们先来看一下这个版本的主要增强。oracle兼容Oracle兼容仍然是这个版本的主要改进之一。1、等待事件完全准确2、oracle(+)外关联,实际机制和https://www.jianshu.com/p/0d7fadda9ef13、支持boolean和numeric自动比较转换4、pl/sql中g......
  • 2023年春招必备-LeetCode刷题笔记最短最优雅经验整理分享
        本资源将根据LeetCode中文版探索板块给出的路线制作题解,各专栏将尽力覆盖各大知识要点并总结知识点和套路。相比于题库解析部分追求代码的绝对精简,本专题追求以高可读性呈现各大专题的常规思路,为后续的题库解析部分做铺垫。俩部分题目可能重复,但专题部分会有更详细的解析......
  • 23年自然语言处理系统性入门学习指南中文版分享
    本教程致力于帮助同学们快速入门NLP,并掌握各个任务的SOTA模型。1.系统入门方法2.各任务模型list汇总:文本分类、文本匹配、序列标注、文本生成(todo)、语言模型3.各任务综述&技巧:文本分类、文本匹配、序列标注、文本生成、语言模型如何系统地入门机器学习是一门既重理论又......