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

答案2023-06-23:

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

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

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

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

使用互斥锁

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

伪代码如下图:

永远不过期

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

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

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

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

2023-06-23:redis中什么是缓存击穿?该如何解决?的更多相关文章

  1. redis之缓存穿透、缓存击穿、缓存雪崩

    一.缓存穿透 1 什么是缓存穿透 缓存穿透是指查询一个在redis和DB中都不存在的数据,redis中查不到去DB查,DB查不到则不写入redis,导致每次查询这个数据都要穿过redis穿透到DB 2 ...

  2. [python]mysql数据缓存到redis中 取出时候编码问题

    描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...

  3. 【redis】redis应用场景,缓存的各种问题

    如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 缓存 redis还有另外一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下 ...

  4. redis应用场景,缓存的各种问题

    缓存 redis还有另外一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下,我们的服务架构如下图,客户端请求service,然后service去读取mysql数据库 问题存 ...

  5. Redis面试题记录--缓存双写情况下导致数据不一致问题

    转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article ...

  6. Redis 中的原子操作(3)-使用Redis实现分布式锁

    Redis 中的分布式锁如何使用 分布式锁的使用场景 使用 Redis 来实现分布式锁 使用 set key value px milliseconds nx 实现 SETNX+Lua 实现 使用 R ...

  7. Redis 中的事务分析,Redis 中的事务可以满足ACID属性吗?

    Redis 中的事务 什么是事务 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durability) 分析下 Redis 中的 ...

  8. Redis(七)缓存穿透、缓存击穿、缓存雪崩以及分布式锁

    应用问题解决 1 缓存穿透 1.1 访问结构 正常情况下,服务器接收到浏览器发来的web服务请求,会先去访问redis缓存,如果缓存中存在数据则直接返回,否则会去查询数据库里面的数据,然后保存在red ...

  9. JAVAEE——宜立方商城06:Redis安装、数据类型和持久化方案、Redis集群分析与搭建、实现缓存和同步

    1. 学习计划 1.首页轮播图展示 2.Redis服务器搭建 3.向业务逻辑中添加缓存. 4.使用redis做缓存 5.缓存同步. 2. 首页轮播图动态展示 2.1. 功能分析 根据分类id查询内容列 ...

  10. spring(三、spring中的eheche缓存、redis使用)

    spring(三.spring中的eheche缓存.redis使用) 本文主要介绍为什么要构建ehcache+redis两级缓存?以及在实战中如何实现?思考如何配置缓存策略更合适?这样的方案可能遗留什 ...

随机推荐

  1. 标准正态分布表—R语言

    正态分布是最重要的一种概率分布.正态分布概念是由德国的数学家和天文学家Moivre于1733年首次提出的,但由于德国数学家Gauss率先将其应用于天文学家研究,故正态分布又叫高斯分布.高斯这项工作对后 ...

  2. QT实现可拖动自定义控件

    使用QT实现自定义类卡牌控件Card,使其能在父类窗口上使用鼠标进行拖动. 控件类头文件card.h #ifndef CARD_H #define CARD_H #include <QWidge ...

  3. 【前端黑魔法】浏览器打开任意可执行exe文件方法

    思路:通过注册表注册自定义URL协议执行bat脚本,将文件路径作为参数传入 环境:win10 前置问题与条件 问题1:可以从浏览器直接打开可执行文件吗? 答:不能.其实可以通过 ActiveXObje ...

  4. [Python]Python安装教程

    anaconda Anaconda:python的一种软件发行版.Anaconda发行版会预装很多pydata生态圈里的软件,而Miniconda是最小的conda安装环境, 一个干净的conda环境 ...

  5. Nordic nRF52系列/nRF5340硬件设计(一)选型及原理图设计

    Nordic 的BLE系列芯片从第一代的nRF51系列,到第二代的nRF52系列,发展到目前最新的第三代的nRF5340.目前市场中使用最多的nRF52系列一共有七款芯片,它们是:nRF52805.n ...

  6. sync.Pool:提高Go语言程序性能的关键一步

    1. 简介 本文将介绍 Go 语言中的 sync.Pool并发原语,包括sync.Pool的基本使用方法.使用注意事项等的内容.能够更好得使用sync.Pool来减少对象的重复创建,最大限度实现对象的 ...

  7. js开发规范

    ####################### 1.缩进 [强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符. [强制] switch中缩进2个空格 [强制] 要求分 ...

  8. 从 HTTP 到 gRPC:APISIX 中 etcd 操作的迁移之路

    罗泽轩,API7.ai 技术专家/技术工程师,Apache APISIX PMC 成员. 原文链接 Apache APISIX 现有基于 HTTP 的 etcd 操作的局限性 etcd 在 2.x 版 ...

  9. 去中心化金融-Lec2

    Finance Finance is the process that involves the creation, management, and investment of money and f ...

  10. blog图片资源