工作几年了,你真的懂 Redis 嘛?

大家好,我是伍六七。一个专注于输出 AI+ 编程内容的在职大厂资深程序员,全国最大 AI 付费社群破局初创合伙人,关注我一起破除 35 诅咒。

Redis 基本上是大部分技术公司都会使用的缓存框架,但是我发现很多程序员其实并不懂 Redis。

今天,阿七带大家从理论和实践的角度来了解和使用 Redis。

1 缓存基本思想

1、不同的存储介质访问延迟不一样,相同成本存储容量不一样

SSD/Disk、Memory、L3 cache、L2 cache、L1 cache 五种存储介质,访问延迟逐渐降低,但是同等成本的容量却逐渐增大。

2、时间局限性原理

被获取过一次的数据在未来会被多次获取。

3、以空间换时间

开辟一块高速独立空间,提供高速访问。

4、性能成本权衡

访问延迟性低、性能越高,等容量成本越高。

2 缓存优势

  1. 提升访问性能
  2. 降低网络拥堵
  3. 减轻服务负载
  4. 增强可扩展性

3 缓存代价

  1. 系统复杂性提高
  2. 存储和部署成本变高
  3. 数据一致性问题

4 缓存的三种模式

4.1 Cache Aside 旁路缓存

核心思想

写操作:更新 DB 之后,直接将 key 从缓存中删除;

读操作:先读缓存,如果没有,则读 DB,同时将 DB 的数据同步到缓存中。

特点

业务端处理所有数据访问细节,同时利用 lazy 懒加载思想,更新 DB 之后,直接删除缓存并通过 DB 更新,确保数据以 DB 为准,可以大幅降低缓存和 DB 之间的不一致的概率。

缺点

1、如果删除缓存失败,可能会有问题;

解决方法

失败增加监控

2、如果同时有比较高的QPS访问刚插入或者更新的数据,可能会打垮DB;

解决方法

使用多线程异步执行查询,防止这种问题。

场景:读多写少。比如用户数据,用户修改用户信息很少,但是各种业务场景用到用户数据的读场景比较多。

4.2 Read/Write Through

核心思想

读写缓存和 DB 的操作,都有一个中间的数据服务代理。

写操作:先查缓存,如果缓存不存在,则只更新 DB;如果缓存中存在,则先更新缓存,再更新 DB,然后返回;

读操作:先查缓存,如果命中则直接返回。否则从 DB 中加载,然后回种到缓存中再返回。

特点:业务端不需要关心数据细节,系统隔离性好

4.3 write-Back 或者 Write-Behind

核心思想

承接 Write Through,写操作更新完缓存之后,异步回写数据到 DB 或者批量回写数据到 DB。

缺点

异步或者批量回写,可能会导致数据丢失。

特点

合并或者异步写 DB,DB 压力小。

使用场景:写频率很高,但是对于数据一致性要求不太高的业务

5 Redis 常见面试题

5.1 Redis 雪崩

概念

大量的应用请求无法在 Redis 缓存中进行处理,紧接着,
应用将大量请求发送到数据库层,导致数据库层的压力激增。

原因

1、缓存中有大量数据同时过期,导致大量请求无法得到处理

2、Redis 缓存实例发生故障宕机了

解决方案

针对原因 1

  • 方法1:避免给大量的数据设置相同的过期时间。
  • 方法2: 降级直接返回预定义信息、空值或是错误信息。

针对原因 2

  • 方法1: 在业务系统中实现服务熔断或请求限流机制。
  • 方法2: 服务端 限流。

事前预防:使用主从节点 构建 Redis 缓存高可靠集群

5.2 击穿

概念:1、是发生在某个热点数据失效的场景下,大量请求直接访问 DB,DB 压力骤增,业务响应延迟。

原因:热点 key 过期失效或者同时失效。

解决办法:热点 key 不设置过期时间;或者设置过期时间为基础时间+随机时间。

5.3 穿透

概念:要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。

原因:1、业务层误删除数据了;2、恶意攻击:专门访问数据库中没有的数据。

解决方法

  • 1、缺省值或者空值。
  • 2、使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。
  • 3、前端进行请求检测

5.4 bigKey

概念:一个缓存 key,存储数据过多。比如一个上万记录的 List;

危害

1、造成内存分配不均匀。比如在 Redis cluster 或者 Codis 中,会造成节点的内存使用不均匀;

2、超时阻塞。因为 Redis 单线程特性,如果操作某个 bigKey 耗时比较久,则后面的请求会被阻塞。

3、网络阻塞,消耗带宽。

4、过期删除,会很慢,会阻塞 Redis。如果 Bigkey 设置了过期时间,当过期后,这个 key 会被删除,假如没有使用 Redis 4.0 的过期异步删除,
就会存在阻塞 Redis 的可能性,并且慢查询中查不到(因为这个删除是内部循环事件)。

如何发现?

Redis 命令: redis-cli --bigkeys

解决方法

  • 删除 bigKey。
  1. Redis4.0 之后,异步删除;
  2. 集合类型:用 scan,读取部分数据删除;
  3. Hash类型,用 Hscan,读取部分数据删除
  • 拆分
  1. String类型,拆分成多个 key
  2. 集合或者 Hash 类型,拆分成多个 List 或者 Hash

5.5 热 key

概念

所谓热 key 问题就是,突然有几十万的请求去访问 Redis 上的某个特定key。

那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台 Redis 的服务器宕机。

解决

1、二级缓存——本地缓存。比如利用 ehCache,或者一个- HashMap 都可以。在你发现热 key 以后,把热 key 加载到系统的 JVM 中。
针对这种热 key 请求,会直接从 jvm 中取,而不会走到 Redis 层。

2、备份热key。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。
接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。

< END >

链接我,免费领取Java面试全套pdf(带答案)

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

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

相关文章

SSM新闻发布管理系统

SSM毕设分享 序号1&#xff1a;SSM新闻发布管理系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【SSM新闻发布管理系统】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数…

三极管在数字电路中的应用

一、认识三极管 三极管拥有3个引脚&#xff0c;分别对应3个级&#xff1a;基极(Base)、发射极&#xff08;Emitter&#xff09;、集电极(Collector)&#xff0c;如下图所示&#xff1b;下图横向左侧的是基极&#xff0c;带箭头的那个引脚就是发射极&#xff0c;另一个就是集电…

【PUSDN】java中easyexcel导入导出带有图片的Excel(main方法方式)

简述 java中easyexcel导入导出带有图片的Excel&#xff08;main方法方式&#xff09;&#xff0c;web方式详见另一篇 由于电脑音频问题&#xff0c;视频暂时没有解说声音&#xff0c; 回头重新补上 前情提示 如果有任何疑问、需求、技术支持&#xff0c;欢迎点赞&#xff0…

JavaWeb-XML

1.常见的配置文件 1.1 properties 数据库的连接就使用properties文件作为配置文件&#xff0c;properties文件中的配置信息是以键值对的形式存储的。 beiluo.jdbc.urljdbc:mysql://localhost:3306/beiluo beiluo.jdbc.drivercom.mysql.cj.jdbc.Driver beiluo.jdbc.usernamer…

【hacker送书活动第7期】Python网络爬虫入门到实战

第7期图书推荐 内容简介作者简介大咖推荐图书目录概述参与方式 内容简介 本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识&#xff0c;然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库&#xff0c;接着介绍了selenium对动态网站的爬取和S…

HADOOP::Fsimage和Edits解析

NameNode被格式化之后&#xff0c;将在/opt/module hadoop-3.1.3/data/tmp/dfs/name/curent目录 中产生如下文件 fsimage_ 0000000000000000000 fsimage_ 0000000000000000000.md5 seen_txid VERSION (1) Fsimage文件: HDFS文件系统元数据的一个永久性的检查点&#xff0…

判断二叉树是否为完全二叉树

具体思路&#xff1a; 将二叉树层序遍历&#xff08;节点&#xff09;插进队列中&#xff0c;遇到空时就break&#xff08;退出循环&#xff09;&#xff0c;再重新遍历一遍&#xff0c;若空的后面又再次出现数据&#xff0c;则返回false&#xff08;不是完全二叉树&#xff0…

基于Java+Swing+Mysql图书管理系统(含实训报告)

基于JavaSwingMysql图书管理系统-含实训报告 一、系统介绍二、功能展示1.用户登陆 四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看登录界面、主页界面、图书类别管理、用户借阅记录、用户图书查询、用户图书归还、用户信息修改。 运行环境&#xff1a;idea、jd…

C# Spire操作Excel数据透视表

一、概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等&#xff0c;可动态地改变透视表版面布置&#xff0c;也可以重新安排行号、列标和页字段。当改变版面布置时&#xff0c;数据透视表也会按照新…

ASP.NET-BS结构的城市酒店入住信息管理系统的设计

2 理论基础 2.1 数据库技术 数据库技术应用中&#xff0c;经常用到的基本概念有&#xff1a;数据库&#xff08;DB&#xff09;、数据库管理系统&#xff08;DBMS&#xff09;、数据库系统&#xff08;DBS&#xff09;、数据库技术及数据模型。 数据库技术是研究数据库的结构、…

基于社区电商的Redis缓存架构-库存模块缓存架构(上)

库存模块缓存架构 我们先来分析一下库存模块的业务场景&#xff0c;分为入库和出库&#xff0c;入库的话&#xff0c;在库存模块中需要添加库存&#xff0c;由于库存也是 写多读多 的场景&#xff0c;那么也是以 Redis 作为主存储&#xff0c;MySQL 作为辅助存储 出库的话&am…

AMBA 5 CHI 协议节点实例和读数据的来源

1. CHI协议节点实例 如上图所示&#xff0c;RN-F、RN-I、HN-F、SN-F、HN-I、SN-I通过内部互联总线连接起来。这里的ICN可以是CMN-700。其中SN-F和SN-I是连接主存&#xff0c;RN-F和HN-F内部都有cache。 2. CHI读数据的可能来源 如上图所示&#xff0c;CHI协议中可能的读数据来…

Win中Redis部署与配置

1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口&#xff0c;默认端口为 6379&#xff0c;作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…

初识Linux:保姆级教学,让你一秒记住Linux中的常用指令!

文章目录 前言一、LInux的背景及发展史二、Linux下的基本指令1、ls指令2、pwd指令3、cd指令4、touch指令5、mkdir指令&#xff08;重要&#xff09;6、tree指令7、rmdir指令和rm指令&#xff08;重要&#xff09;8、man指令&#xff08;重要&#xff09;9、cp指令&#xff08;重…

分享77个焦点幻灯JS特效,总有一款适合您

分享77个焦点幻灯JS特效&#xff0c;总有一款适合您 77个焦点幻灯JS特效下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚欢喜&…

c语言调用free,提示已触发了一个断点。

在用c语言写数据结构的链表的时候&#xff0c;执行也没有什么大错&#xff0c;逻辑也是对的&#xff0c;但是一道free函数会自动触发一个断点。如图&#xff1a; 这个断点产生的原因是由于分配的内存太小了在使用的时候没有任何问题&#xff0c;但是在执行程序的时候&#xff0…

pytest系列——allure之在测试用例添加标题(@allure.title())

前言 通过使用装饰器allure.title可以为测试用例自定义一个更具有阅读性的易读的标题。 allure.title的三种使用方式&#xff1a; 直接使用allure.title为测试用例自定义标题&#xff1b;allure.title支持通过占位符的方式传递参数&#xff0c;可以实现测试用例标题参数化&a…

还搞不懂什么是参数,超参数吗?三分钟快速了解参数与超参数的概念和区别!!!

文章目录 前言一、参数是什么&#xff1f;二、超参数是什么三&#xff0c;常使用的超参数有哪些 前言 参数是模型中可被学习和调整的参数&#xff0c;通过训练数据进行学习和优化&#xff1b; 而超参数则是手动设置的参数&#xff0c;用于控制模型的行为和性能&#xff0c;超…

Java基础之数组拷贝

Arrays.copyOf 详解 copyOf是Arrays类下面的一个方法,用于拷贝各种数组 以整型数组为例&#xff1a;int [ ] copyOf(int [ ]array,int newLength);第一个参数是想要拷贝到数组&#xff0c;第二个参数是新拷贝得到的数组的大小&#xff08;不一定非得和原始数组大小一样&…

深入理解:Class.getResource与ClassLoader.getResource使用区别

深入理解&#xff1a;Class.getResource与ClassLoader.getResource使用区别 一作用&#xff1a;都是使用类的类加载器来读取某个文件&#xff0c;从而获取该文件的URL对象二Class.getResource()方法读取文件&#xff1a;1.若文件路径以“/”开头&#xff0c;则该方法会从classp…