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.rhkb.cn/news/219802.html

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

相关文章

Axure的交互与情形,事件,动作

交互样式 交互样式是指当用户与原型进行交互时,元素所呈现出的视觉效果。在Axure中,可以通过设置交互样式来调整元素在交互过程中的外观,例如改变颜色、大小、位置等。 交互事件 交互事件是指在用户与原型进行交互时触发的动作。在Axure中&…

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS (1)环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址: https://download…

如何使用Docker进行容器的备份和恢复

一 简介: 在使用Docker进行应用程序的容器化部署时,我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性,而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复,同时提…

【springboot】application配置文件(1)

servlet:multipart:max-file-size: 100MBmax-request-size: 100MB 这些配置是关于servlet的,特别是与文件上传相关的部分。具体来说,它们涉及到multipart的处理,这是处理HTTP的multipart/form-data类型请求的方法,通常用于文件上传…

PostgreSQL常用命令

数据库版本 :9.6.6 注意 :PostgreSQL中的不同类型的权限有 SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE 和 USAGE。 1. 登录PG数据库 以管理员身份 postgres 登陆,然后通过 #psql -U postgres #sudo -i -u postgres …

Ansible:模块1

Ansible: 远程操作主机功能 自动化运维(playbook 剧本 yaml) 是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是一军突起。 Ansible能批量配置,部署,管理上千台主机。类似于xshell的一…

【Hadoop面试】HDFS读写流程

HDFS(Hadoop Distributed File System)是GFS的开源实现。 HDFS架构 HDFS是一个典型的主/备(Master/Slave)架构的分布式系统,由一个名字节点Namenode(Master) 多个数据节点Datanode(Slave)组成。其中Namenode提供元数…

黑豹程序员-axios+springmvc传递数组

问题 奇怪的现象,axios在往后台传递数组时,springmvc竟然接收不到 解决 尝试多次无果,突然看一篇文章写vue中的数组不是真正的数组需要强转转化JSON.stringify 将信将疑下测试了一把,还真的传递成功了。 不光要JSON.stringify…

Kotlin 笔记 -- Kotlin 语言特性的理解(一)

函数引用、匿名函数、lambda表达式、inline函数的理解 双冒号对函数进行引用的本质是生成一个函数对象只有函数对象才拥有invoke()方法,而函数是没有这个方法的kotlin中函数有自己的类型,但是函数本身不是对象,因此要引用函数类型就必须通过双…

数据结构 | 堆排序

#include<stdlib.h> #include<iostream.h> /* template<class T>//方法1 void BuildHeap(T* pa,int size) //建堆 {for(int isize/2-1;i>0;i--) //从邻近叶子的第一个非叶子结点至根节点PercolateDown(pa,i,size); //向下调整为堆 }template<class T&…

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…

项目篇 | 图书管理系统 | 图像加载与绘制

项目篇 | 图书管理系统 | 图像加载与绘制 基本介绍 首先解释清楚什么叫图像加载与绘制,意思就是说项目中需要用到一些图片资源(各种图标),我们要在图书管理系统中展示这些图片,就需要先导入图片到项目中,再加载图片资源(通过资源路径)、绘制图片(即展示)。 注:如果…

算法——分治

思想&#xff1a;分而治之&#xff0c;将大问题转化为若干个相同或相似的子问题。快排的题目常见的方法是利用三指针法将数组分三块搭配随机选择基准元素的思想 颜色分类&#xff08;分治_快排&#xff09; 颜色分类 题目解析 原地对它们进行排序&#xff0c;使得相同颜色的元…

bugku -- eval

<?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> //这段代码包含了一个PHP脚本。首先&#xff0c;它包含了一个名为"flag.php"的文件。然后&#xff0c;它定义了一个变量$a&#xff0c…

15个电脑小技巧

01.磁盘清理 电脑C盘满了就会变的很卡,先不着急打开清理软件,用电脑自带的磁盘清理工具先清理一下,也能腾出不少空间。 打开【此电脑】,鼠标右击C盘,点击【属性】-【磁盘清理】即可。 02.虚拟键盘 玩游戏的时候喜欢用虚拟键盘,教你如何显示出来。按【Win+R】输入“osk…

链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)

目录 一、双向链表的概念 二、 双向链表的优缺点分析​与对比 2.1双向链表特点&#xff1a; 2.2双链表的优劣&#xff1a; 2.3循环链表的优劣 2.4 顺序表和双向链表的优缺点分析​ 三、带头双向循环链表增删改查实现 3.1SList.c 3.2创建一个新节点、头节点 3.3头插 3.…

成为软件测试工程师需要学什么?

成为软件测试工程师需要学习测试环境的搭建、前端开发知识、数据库知识、测试理论基础、开发语言基础、自动化测试、进阶内容。 1、测试环境的搭建 本部分主要是学习从操作系统开始&#xff0c;有关的计算机基础知识、软件和硬件知识、计算机理论知识、网络知识、如何在一个操…

C/C++ 表达式求值(含多位数)

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、解析 分析 最后直接上代码&#xff01; 一、前言 表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼…

WPF——命令commond的实现方法

命令commond的实现方法 属性通知的方式 鼠标监听绑定事件 行为&#xff1a;可以传递界面控件的参数 第一种&#xff1a; 第二种&#xff1a; 附加属性 propa&#xff1a;附加属性快捷方式

【谭浩强C语言:前八章编程题(多解)】

文章目录 第一章1. 求两个整数之和(p7) 第二章2. 求三个数中的较大值&#xff08;用函数&#xff09;(p14、p107)3.求123...n(求n的阶乘&#xff0c;用for循环与while循环)(P17)1.循环求n的阶乘2.递归求n的阶乘(n< 10) 4.有M个学生&#xff0c;输出成绩在80分以上的学生的学…