为什么你用的redis没有出现雪崩,击穿,穿透

一、前言

在大规模并发访问系统中,如果你的系统用到redis,在面试的时候面试官往往会问你的系统有没有出现雪崩,击穿,穿透这样的场景,然后是怎样解决的。博主也经常反复温习redis的特性,总是被雪崩,击穿,穿透这几个词迷惑,因为这几个词虽然是形象的比喻,但是用的太恐怖了,往往又让人难以记住。

二、三个场景解析

1、缓存雪崩(在同一时刻出现大面积的缓存过期)

由于原有缓存失效,新缓存未到时间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

其实简单一句话,就是所有缓存同一时间失效了,就是雪崩。但是用雪崩了来形容,感觉有点牵强,让人记不住是什么场景。雪崩就是崩塌了 要死人了。和缓存同一时间失效,比喻不上。还不如直接就叫缓存同时失效。

那我们就暂定:缓存同时失效。

谁的系统会会涉及成这个样子? 所以你用的redis很难出现雪崩的现象,除非是你故意干的。

2、缓存击穿(就是大量并发访问一个key时,缓存失效了)

某个 key 非常非常热,访问非常的频繁,高并发访问的情况下,当这个 key在失效(可能expire过期了,也可能LRU淘汰了)的瞬间,大量的请求进来,这时候就击穿了缓存,直接请求到了数据库,一下子来这么多,数据库肯定受不了,这就叫缓存击穿。某个key突然失效,然后这时候高并发来访问这个key,结果缓存里没有,都跑到db了。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

那我们就暂定(并发访问一个失效的key ),简简单单的。 什么击穿,这是暴力比如。

这种场景可能容易遇到,在高并发场景下,但是也只是瞬间,除非你的并发量真的高到无敌,要不然系统即使缓存被穿透,其实也没什么影响,很快就能恢复。

3、缓存穿透

是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。

简简单单,就是查了一个数据库不存在的数据。意思是如果数据库没有的数据被缓存应该做标志,不要去查询数据库了。

总结:redis的三个恐怖的玩意,我们大事化小,小时化无。 就是你的redis设计时,

1.有没有出现大量缓存同时失效的场景。

2.有没有大量的并发同时访问一个失效时间比较短的key,

3.查询缓存的数据数据库里是不是本身就没有。

相信以上傻逼一样的系统也不会出现这三种情况吧?所以你的系统很少出现什么redis雪崩,击穿,穿透。所以面试问到的时候你也不太懂。

三、springboot使用 redis

在Spring Boot中使用Redis,你需要按照以下步骤进行配置和使用:

  1. 添加依赖:首先,你需要在你的pom.xml文件中添加Spring Boot的Redis依赖。你可以选择spring-boot-starter-redis或者spring-boot-starter-data-redis。例如:

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>
  1. 配置Redis:在application.propertiesapplication.yml文件中添加Redis的配置。你需要指定Redis的数据库索引、服务器地址、密码(如果有的话)和端口。例如:

spring.redis.database=0  
spring.redis.host=127.0.0.1  
spring.redis.password=your_password  # 如果有密码的话  
spring.redis.port=6379
  1. 连接到Redis:在你的Spring Boot应用中,你可以像注入其他Spring Bean一样注入RedisConnectionFactoryStringRedisTemplateRedisTemplate实例。例如:

@Autowired  
private RedisTemplate<Object, Object> redisTemplate;

这些模板类提供了许多方法来操作Redis,例如opsForValue().set(key, value)opsForValue().get(key)等。
4. 使用Redis:一旦你有了连接到Redis的模板,你就可以开始使用Redis了。例如,你可以存储和获取字符串、列表、集合、哈希等。

// 存储字符串  
stringRedisTemplate.opsForValue().set("myKey", "myValue");  // 获取字符串  
String value = stringRedisTemplate.opsForValue().get("myKey");  // 存储哈希  
Map<String, String> hash = new HashMap<>();  
hash.put("field1", "value1");  
hash.put("field2", "value2");  
stringRedisTemplate.opsForHash().putAll("myHash", hash);  // 获取哈希  
Map<String, String> result = stringRedisTemplate.opsForHash().entries("myHash");

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

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

相关文章

不懂咱就学,记不住多看几遍(二)

一、Redis分布式锁中加锁与解锁、过期如何续命 实现要点&#xff1a; 互斥性&#xff0c;同一时刻&#xff0c;只能有一个客户端持有锁。防止死锁发生&#xff0c;如果持有锁的客户端因崩溃而没有主动释放锁&#xff0c;也要保证锁可以释放并且其他客户端可以正常加锁。加锁和…

WPF中样式

WPF中样式:类似于winform中控件的属性 <Grid><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/></Grid&g…

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

ALINX黑金AXU3EGB 开发板用户手册RS485通信接口图示DI RO信号方向标识错误说明

MAX3485这类RS485芯片&#xff0c;DI是TTL信号输入&#xff0c;RO是TTL信号输出 如下图是MAX3485手册规格书。 因此 ALINX黑金AXU3EGB 用户手册 Page 43页 图 3-11-1 PL 端 485 通信的连接示意图&#xff0c;MAX3485芯片的DI RO信号输入输出标识方向是错误的&#xff0c;应为蓝…

Redis 只会用缓存?16种妙用让同事直呼牛X

1、缓存2、数据共享分布式3、分布式锁4、全局ID5、计数器6、限流7、位统计8、购物车9、用户消息时间线timeline10、消息队列11、抽奖12、点赞、签到、打卡13、商品标签14、商品筛选15、用户关注、推荐模型16、排行榜图片 1、缓存 String类型 例如:热点数据缓存(例如报表、明…

机器学习---HMM前向、后向和维特比算法的计算

1. HMM import numpy as np# In[15]:class HiddenMarkov:def forward(self, Q, V, A, B, O, PI): # 使用前向算法N len(Q) # 状态序列的大小M len(O) # 观测序列的大小alphas np.zeros((N, M)) # alpha值T M # 有几个时刻&#xff0c;有几个观测序列&#xff0c;就有…

小米4A路由器如何刷OpenWRT并结合内网穿透实现公网远程访问

文章目录 推荐前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 推荐 前些天发现了一个巨牛的人工智…

红队学习笔记Day6 --->干货分享

今天看到这样的一个东西&#xff0c;好好好&#xff0c;有点恐怖&#x1f613;&#x1f613;&#x1f631;&#x1f631;&#x1f631;&#x1f631; 我就想网安是不是也有这种东西&#xff1f; 我来试试 icmp&#xff0c;RDP&#xff0c;arp&#xff0c;dhcp&#xff0c;nat&a…

Android 基础技术——Binder 机制

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于Binder 机制 什么是Binder 机制&#xff1a;Binder 是一种进程间通信机制 驱动&#xff1a;Binder 是一个虚拟物理设备驱动 应用层&#xff1a;Binder 是一个能发起通信的 Java 类 为什么要使用Bind…

react封装通用Modal弹窗组件

目录 1、【src/component/modal/hoc.js】 2、【src/component/modal/componentModal.js】 3、【src/page/projectView.js】 【说明】&#xff1a;后台管理的项目中会经常遇到弹窗&#xff0c;于是封装了一个简单的公共弹窗组件 这个公共组件不适用复杂的功能&#xff0c;简单的…

20. 【Linux教程】emacs 编辑器

前面小节介绍了如何使用 vim 编辑器和 nano 编辑器&#xff0c;本小节介绍 emacs 编辑器&#xff0c;emacs 编辑器最开始是作为控制台的编辑器&#xff0c;并且 emacs 编辑器仍然提供最早的命令行模式。 1. 检查 Linux 系统中是否安装 emacs 编辑器 使用如何命令检查 emacs 编…

SpringIOC之support模块SimpleThreadScope

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

PAM | 账户安全 | 管理

PAM PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插入式身份验证模块&#xff09;是一个灵活的身份验证系统&#xff0c;允许我们通过配置和组合各种模块来实现不同的身份验证策略。 在 Linux 或类 Unix 系统中&#xff0c;常见的 PAM 模块包括以下几种类…

零基础搭建 Kubernetes 集群

零基础搭建 Kubernetes 集群 1、简介 在数字化时代&#xff0c;容器技术已经变成了软件开发和部署的标准&#xff0c;而在众多容器管理工具中&#xff0c;Kubernetes&#xff08;简称为 K8s&#xff09;凭借其高效的资源管理、弹性伸缩和自我修复的能力&#xff0c;成为了行业…

多线程、分布式运行用例

python多线程 threading模块 多线程实例 # -*- coding: utf-8 -*- # Time : 2024/2/7 15:50 # Author : 居里夫人吃橘子 # File : class01.py # Software: PyCharm import threading from time import sleepdef run(name):print(name 该起床了)sleep(2)print(name …

Linux CentOS系统安装SQL Server并结合内网穿透实现公网访问本地数据

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Ubuntu在终端编辑完配置文件怎么保存退出?

1.退出&#xff0c;按【Ctrlx】&#xff0c;回车键。 2.保存&#xff0c;则先按【Ctrlo】&#xff0c;回车键&#xff0c;再按【Ctrlx】退出

小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】

1025 除数游戏 小艾 和 小鲍 轮流玩游戏&#xff0c;小艾首先开始。 最初&#xff0c;黑板上有一个数字 n 。在每个玩家的回合中&#xff0c;该玩家做出的动作包括&#xff1a; 选择任意 x&#xff0c;使 0 < x < n 和 n % x 0 。将黑板上的数字 n 替换为 n - x 。 此…

Dom节点继承树基本操作

遍历节点树 基于元素节点树的遍历 parcntElcrmcnt -> 返回当前元素的父元秦节点 (IE不兼容)children ->只返回当前元素的元素子节点node.childFlement(ount nodechildren.length当前元素节点的子元素(IE不兼容)firstElementChild->返回的是第一个元素节点(IE不兼容)l…

IDEA-常用插件

1、Mybatis Log Free 当我们使用mybatis log在控制台输出sql 内容&#xff0c;输出内容将语句与参数分开打印&#xff0c;还需要手动将参数替换到指定位置。 使用对应插件后&#xff0c;自动将输出内容组装成完整的可直接执行的SQL 在插件市场 查看对应名称&#xff0c;并安装。…