redis:二、缓存击穿的定义、解决方案(互斥锁、逻辑过期)的优缺点和适用场景、面试回答模板和缓存雪崩

缓存击穿的定义

缓存击穿是一种现象,具体就是某一个数据过期时,恰好有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。典型场景就是双十一等抢购活动中,首页广告页面的数据过期,此时刚好大量用户进行请求,那么数据库很容易抵挡不住,从而宕机。

解决方案之一:互斥锁(分布式锁)

当缓存失效时,先使用如 Redis 的 setnx 去设置一个互斥锁,当查询数据库重建缓存数据,成功返回并写入缓存时才释放锁,此时其他线程才能继续访问缓存。
在这里插入图片描述

优点、缺点、适用场景

优点:强一致性
缺点:性能较差,无法保障高可用性,可能产生死锁的问题。
适用场景:业务和钱等挂钩时,一般要保障强一致性,所以选择互斥锁。

解决方案之二:逻辑过期

逻辑过期就是除了业务逻辑真正需要的字段(如下图的id和title)之外,还额外设置一个字段用来判断缓存是否过期,一般为expire。而key本身是不设置过期时间的。
当查询数据时,首先会通过expire字段判断该数据是否过期,如果过期则获取互斥锁,并开启一个新线程。新线程进行查询db、重建缓存、写入缓存,重置逻辑过期时间等操作。**与此同时原线程直接返回过期了的数据。(不是等待新线程操作完成)**如果以上发现缓存过期的任意过程中,有其他线程想要查询该数据,也会首先通过expire字段来判断该数据是否过期,发现过期且此时新线程还未释放锁,就会因获取互斥锁失败而直接返回过期数据,如果已经释放了锁,那么就直接返回新数据。
在这里插入图片描述

优点、缺点、适用场景

优点:高可用、性能优
缺点:无法保障强一致性。
适用场景:除了和钱挂钩等业务场景,一般更看重用户体验,所以采用逻辑过期。

高可用的定义

高可用(Highavailability,缩写为HA),是指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用的主要目的是为了保障“业务的连续性”,即在用户眼里,业务永远是正常对外提供服务的。

面试题回答模板

什么是缓存击穿 ? 怎么解决 ?

背熟以下回答,大概用时2分。

缓存击穿是一种现象,具体就是某一个数据过期时,恰好有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。典型场景就是双十一等抢购活动中,首页广告页面的数据过期,此时刚好大量用户进行请求,那么数据库很容易抵挡不住,从而宕机。针对缓存击穿,我们一般有两种解决方案,分别是互斥锁和逻辑过期。

互斥锁就是当缓存失效时,先使用如 Redis 的 setnx 去设置一个互斥锁,当重建缓存成功时才释放锁,此时其他线程才能继续访问缓存。它的优点是保障了数据的强一致性,缺点是性能较差,无法保障高可用性,而且可能产生死锁的问题。当业务和钱等挂钩时,一般要保障强一致性,所以选择互斥锁。

逻辑过期就是除了业务逻辑真正需要的字段之外,还额外设置一个字段用来判断缓存是否过期,一般为expire。而key本身是不设置过期时间的。
当查询数据时,首先会通过expire字段判断该数据是否过期,如果过期则获取互斥锁,并开启一个新线程去重建缓存。与此同时原线程直接返回过期了的数据。如果以上过程中,有其他线程想要查询该数据,也会首先通过expire字段来判断该数据是否过期,发现过期且此时新线程还未释放锁,就会因获取互斥锁失败而直接返回过期数据,如果已经释放了锁,那么就直接返回新数据。采用逻辑过期的优点就是它有高可用性,性能较优。但与此同时,就无法保障数据的强一致性。

缓存雪崩

定义

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案

给不同的Key的TTL添加随机值
利用Redis集群提高服务的可用性(哨兵模式、集群模式)
给缓存业务添加降级限流策略(ngxin或spring cloud gateway)
给业务添加多级缓存(Guava或Caffeine)

面试题回答模板

什么是缓存雪崩 ? 怎么解决 ?

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。解决方案主要是可以将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

本文所有图片来自于黑马程序员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284117.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud:对象存储组件MinIO

类似于FastDFS/HDFS的一个文件存储服务! SpringBoot整合MinIO实现分布式文件服务! #MinIO简介? Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的…

什么是开放式耳机?骨传导耳机是开放式耳机吗?

一、什么是开放式耳机? 开放式耳机是一种无需入耳佩戴的蓝牙耳机,在佩戴上比传统入耳耳机更加稳固舒适,更适合运动场景佩戴,而且使用的时候不会隔绝周围环境声,可以时刻注意到周围的环境变化,使用更安全。…

PFA三口烧瓶本底纯净耐强酸实验室常用反应烧瓶

PFA(聚氟乙烯)三口烧瓶是一种在化学实验室中广泛使用的常规实验仪器,它具有许多优点,使其成为许多实验室中使用的首选容器。以下是PFA三口烧瓶的主要优点: 1. 高耐化学性:PFA三口烧瓶是由聚氟乙烯制成的&am…

触想智能工业一体机在金属3D打印机上的应用

1、行业发展背景 3D打印又称“增材制造”,是一种以数字模型为基础,通过逐层堆叠将打印材料熔结固化为三维实体物件的先进制造技术。 随着航空航天、科研、医疗、汽车等精工领域的颠覆性发展,制造业对于高强度、高精度、轻量型、柔性化金属零件…

NFTScan | 12.11~12.17 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.12.11~ 2023.12.17 NFT Hot News 01/ Pudgy Penguins 衍生 NFT Lil Pudgys 过去一天成交量超 1000 枚 ETH,位居第二 12 月 11 日,据 OpenSea 数据显示&#…

Day63力扣打卡

打卡记录 寻找最近的回文数(模拟) 链接 class Solution:def nearestPalindromic(self, n: str) -> str:m len(n)candidates [10 ** (m - 1) - 1, 10 ** m 1]selfPrefix int(n[:(m 1) // 2])for x in range(selfPrefix - 1, selfPrefix 2):y …

Kotlin Multiplatform的现状—2023年网络研讨会

Kotlin Multiplatform的现状—2023年网络研讨会 在2023年,Kotlin Multiplatform因其开发、当前状态和未来潜力而受到了相当大的关注。随着越来越多的开发者对采用KMP进行跨平台解决方案表示兴趣,JetBrains在11月下旬推出了一系列网络研讨会作为回应。首…

功放诊断测试

1.切换trace显示时间模式,Toggle time mode 2.测seedkey 需要加载seednkey.dll 3.功能寻址和物理寻址切换

制作RK3568 ubuntu20.04桌面版镜像

平台 主控: RK3568 编译主机: Ubuntu 20.04 AMD64 目标版本: Ubuntu 20.04 概述 RK3568是极具性价比的高能国产“芯“ , 是Rockchip面向与AIOT和工业市场打造的一款高性能、低功耗、功能丰富的国产化应用处理器。采用四核64位Cortex-A55架构,主频高达2.0GHz&#x…

【docker】修改docker的数据目录

背景 主节点是分配了较少内存和存储的低配机器,因为我们系统的rancher是用docker镜像启动的,而rancher和docker的默认目录都放在/var/lib下面,而这个/var目录目前只分配10G的存储,导致节点存储报警。因此想修改docker的数据目录&…

Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间?

Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「 Linux的资料从专业入门到高级教程工具包」,点个关注&…

非常好用的C++跨平台网络通信Mongoose,随笔记录

简介 Mongoose 是一个 C/C 网络库。它实现了事件驱动, TCP、UDP、HTTP、WebSocket、MQTT 的非阻塞 API。它连接设备 并将它们带到网上。自 2004 年以来,一些开源和商业 产品已经利用了它。它甚至运行在 国际空间站! Mongoose 使嵌入式网络编…