Redis进阶知识点(可学习,可复习,可面试)(1),java只背面试题-程序员宅基地

技术标签: 2024年程序员学习  学习  面试  redis  

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

在这里插入图片描述

主动更新策略


一般来说,缓存有以下三种模式:

Cache Aside 更新模式 :由缓存的调用者,在更新数据库时同时更新缓存。

Read/Write Through 更新模式 :先更新缓存,缓存负责同步更新数据库

Write Behind Caching 更新模式: 先更新缓存,缓存定时异步更新数据库

Cache Aside Pattern

在很多情况下,此更新模式都是很适合的,因此在这里详细讲解这种更新模式。

在操作缓存和数据库时是先操作缓存还是先操作数据库呢?

此时先给出答案:

先操作数据库,在操作缓存比较合适

第一种情况

在这里插入图片描述

刚开始缓存和数据库中的数据都是10

  1. 线程1删除缓存。此时缓存中无数据,数据库中的数据为10

  2. 线程2查询缓存,因为缓存中没有数据,所以无法命中缓存,只能从数据库中查询,查询数据为10

  3. 线程2将查询到的数据10写入到缓存中,此时数据库中数据为10,缓存中数据为10

  4. 线程1此时更新数据库中的数据,将值改为20。所以这就造成了数据库和缓存中的数据不一致。

在这里插入图片描述

第二种情况

在这里插入图片描述

刚开始数据库中的数据为10,假设缓存数据过期失效

  1. 线程1查询缓存,由于缓存失效,所以查询数据库。

  2. 此时线程2突然要更新数据库,将数据改为20。

  3. 此时线程2删除缓存,由于缓存中没有数据,因此删了个寂寞

  4. 这时线程1再把数据写入缓存,此时写入缓存的数据是10。这就造成了缓存和数据库中的数据不一样,缓存中的数据为10,数据库中的数据为20。

虽然第二种情况会造成缓存和数据库中的数据不一样,但是这种情况发生的概率是微乎其微的。

因为写入缓存的速度是要快于更新数据库操作的,所以线程1查询数据库后,几乎不会等线程2更新数据库完数据库后再写入缓存。并且这种情况还要在缓存失效的前提下才能发生,所以第二种在整体上胜出第一种

因此还是先操作数据库再操作缓存比较合适

在这里插入图片描述

Read/Write Through Pattern

Read Through 模式就是在查询操作中更新缓存,也就是说,当缓存失效的时候,Cache Aside 模式是由调用方负责把数据加载入缓存,而 Read Through 则用缓存服务自己来加载

Write Through 模式和 Read Through 相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后由缓存自己更新数据库(这是一个同步操作)。

Write Behind Caching Pattern

Write Behind Caching 更新模式就是在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是直接操作内存速度快。因为异步,Write Behind Caching 更新模式还可以合并对同一个数据的多次操作到数据库,所以性能的提高是相当可观的。

但其带来的问题是,数据不是强一致性的,而且可能会丢失。另外,Write Behind Caching 更新模式实现逻辑比较复杂,因为它需要确认有哪些数据是被更新了的,哪些数据需要刷到持久层上。只有在缓存需要失效的时候,才会把它真正持久起来。

在这里插入图片描述

缓存穿透


缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,所以不能从缓存上面取到客户端想要的数据,并且这些请求都会打到数据库上,导致数据库短时间内承受大量的请求而崩溃

而解决缓存穿透的方案通常有两种:

1.缓存空对象

从缓存上取不到数据,在数据库中也取不到,这时可以把key-value键值对写成key-null键值对,并且设置有效时间(设置短一些)。这样可以防止带有恶意的用户频繁地用一个值来攻击数据库。

在这里插入图片描述

优点:实现简单,便于维护

缺点:需要消耗额外的内存;

并且可能造成短期的不一致

2.布隆过滤器

过滤器,顾名思义,就是不让某些请求通过,不放行某些恶意的请求。

在缓存中,采用布隆过滤器,将可能存在的数据哈希到足够大的bitmap上,如果客户端请求的数据不存在,布隆过滤器会拒绝客户端的请求,如果存在则会放行请求,再去查询缓存,按步骤执行后面的操作

在这里插入图片描述

在这里插入图片描述

缓存雪崩


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

缓存雪崩的解决方案有以下几种:

1.给不同的Key的TTL值添加随机值(如1-5分钟随机),防止同一时间段内大量数据发生过期的现象

2.不给缓存设置失效时间,让它永久有效

3.利用Redis集群提高服务的可用性。将热点的key放到不同的节点上。

4.可以考虑加锁(最多使用)或者队列的方式来保证不会有大量的线程对数据库一次性读写,从而避免了key失效时大量的并发请求落到存储系统上

缓存击穿


缓存击穿问题也叫热点Key问题,是一个被高并发访问并且缓存创建业务较复杂的key突然失效了,缓存中没有数据但数据库中有数据,并发用户无数的请求访问读缓存不能读到数据,又同时去数据库里查询数据,这无数的请求会瞬间给数据库带来巨大的冲击导致数据库压力过大。

缓存击穿和缓存雪崩很相似,但不同的是,缓存击穿是指客户端并发查同一条数据,缓存雪崩是指不同的数据都过期了,很多数据都查不到而去数据库中查询。

解决方案:

1.加互斥锁

加互斥锁只允许一个线程重建缓存,其他线程等待上锁的线程重建缓存步骤执行完,释放锁后,其他线程再重新从缓存上获取数据

优点:

**没有额外的内存消耗;

保证了一致性;

实现起来比较简单**

缺点:

**线程需要等待,性能受到影响;

还可能出现死锁的风险**

2.逻辑过期

给每个value设置一个过期时间,当发现超过逻辑过期时间后,会使用单独的线程去更新缓存。

但从缓存层面上来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。

优点:

线程无须等待,性能较好

缺点:

**不能保证一致性;

有额外的内存消耗;

实现起来比较复杂**

在这里插入图片描述

redis持久化

=========================================================================

首先需要了解什么是持久化。持久化就是把内存中的数据写到磁盘中去,防止服务器宕机造成内存中的数据丢失

redis持久化的方式有两种,一种是RDB持久化,一种是AOF持久化。

在这里插入图片描述

RDB持久化


RDB全称Redis Database Backup file(Redis数据备份文件) 也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

Redis停机时会执行一次RDB。

Redis内部有触发RDB的机制,它的命令举例如下:

save命令

Reids save命令执行一个同步保存操作,将当前Redis实例的所有数据快照(snapshort)已RDB文件的方式保存到磁盘

bgsave命令

bgsave执行后,会立刻返回OK,Redis 会fork一个子进程,原来的redis主进程继续执行后续操作,新fork的子进程负责将数据保存到磁盘,然后退出


save 900 1 表示900秒内,如果有至少一个key被修改,则执行bgsave



如果是 save " ",表示禁用RDB

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。

fork采用的是copy-on-write技术:

当主进程执行读操作时,访问共享内存;

当主进程执行写操作时,则会拷贝一份数据,执行写操作。

在这里插入图片描述

RDB方式bgsave的基本流程:

1.fork主进程得到一个子进程,共享内存空间

2.子进程读取内存数据并写入新的RDB文件

3.用新RDB文件替换旧的RDB文件。

在这里插入图片描述

RDB方式的优缺点

优点:

(1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备。

(2)RDB对redis对外提供读写服务的时候,影像非常小,因为redis 主进程只需要fork一个子进程出来,让子进程对磁盘io来进行rdb持久化

(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

缺点:

(1)如果redis要故障时要尽可能少的丢失数据,RDB没有AOF好,例如1:00进行的快照,在1:10又要进行快照的时候宕机了,这个时候就会丢失10分钟的数据。

(2)fork子进程、压缩、写出RDB文件都比较耗时。RDB每次fork出子进程来执行RDB快照生成文件时,如果文件特别大,可能会导致客户端提供服务暂停数毫秒或者几秒

在这里插入图片描述

AOF持久化


AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。当重启Redis时会重新将持久化的日志中文件恢复数据。

由于AOF记录的是命令,所以AOF文件比RDB文件大得多。并且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。

如:

set num Tom;

结尾

查漏补缺:Java岗 千+道面试题Java基础+全家桶+容器+反射+异常等

这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-xUyYWmUO-1713425582479)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84411593/article/details/137923667

智能推荐

解决win10/win8/8.1 64位操作系统MT65xx preloader线刷驱动无法安装_mt65驱动-程序员宅基地

文章浏览阅读1.3w次。转载自 http://www.miui.com/thread-2003672-1-1.html 当手机在刷错包或者误修改删除系统文件后会出现无法开机或者是移动定制(联通合约机)版想刷标准版,这时就会用到线刷,首先就是安装线刷驱动。 在XP和win7上线刷是比较方便的,用那个驱动自动安装版,直接就可以安装好,完成线刷。不过现在也有好多机友换成了win8/8.1系统,再使用这个_mt65驱动

SonarQube简介及客户端集成_sonar的客户端区别-程序员宅基地

文章浏览阅读1k次。SonarQube是一个代码质量管理平台,可以扫描监测代码并给出质量评价及修改建议,通过插件机制支持25+中开发语言,可以很容易与gradle\maven\jenkins等工具进行集成,是非常流行的代码质量管控平台。通CheckStyle、findbugs等工具定位不同,SonarQube定位于平台,有完善的管理机制及强大的管理页面,并通过插件支持checkstyle及findbugs等既有的流..._sonar的客户端区别

元学习系列(六):神经图灵机详细分析_神经图灵机方法改进-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏27次。神经图灵机是LSTM、GRU的改进版本,本质上依然包含一个外部记忆结构、可对记忆进行读写操作,主要针对读写操作进行了改进,或者说提出了一种新的读写操作思路。神经图灵机之所以叫这个名字是因为它通过深度学习模型模拟了图灵机,但是我觉得如果先去介绍图灵机的概念,就会搞得很混乱,所以这里主要从神经图灵机改进了LSTM的哪些方面入手进行讲解,同时,由于模型的结构比较复杂,为了让思路更清晰,这次也会分开几..._神经图灵机方法改进

【机器学习】机器学习模型迭代方法(Python)-程序员宅基地

文章浏览阅读2.8k次。一、模型迭代方法机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;2、模型融合的方法,将旧模..._模型迭代

base64图片打成Zip包上传,以及服务端解压的简单实现_base64可以装换zip吗-程序员宅基地

文章浏览阅读2.3k次。1、前言上传图片一般采用异步上传的方式,但是异步上传带来不好的地方,就如果图片有改变或者删除,图片服务器端就会造成浪费。所以有时候就会和参数同步提交。笔者喜欢base64图片一起上传,但是图片过多时就会出现数据丢失等异常。因为tomcat的post请求默认是2M的长度限制。2、解决办法有两种:① 修改tomcat的servel.xml的配置文件,设置 maxPostSize=..._base64可以装换zip吗

Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字-程序员宅基地

文章浏览阅读1k次,点赞17次,收藏22次。Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字

随便推点

ESXi 快速复制虚拟机脚本_exsi6.7快速克隆centos-程序员宅基地

文章浏览阅读1.3k次。拷贝虚拟机文件时间比较长,因为虚拟机 flat 文件很大,所以要等。脚本完成后,以复制虚拟机文件夹。将以下脚本内容写入文件。_exsi6.7快速克隆centos

好友推荐—基于关系的java和spark代码实现_本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。-程序员宅基地

文章浏览阅读2k次。本文主要实现基于二度好友的推荐。数学公式参考于:http://blog.csdn.net/qq_14950717/article/details/52197565测试数据为自己随手画的关系图把图片整理成文本信息如下:a b c d e f yb c a f gc a b dd c a e h q re f h d af e a b gg h f bh e g i di j m n ..._本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。

南京大学-高级程序设计复习总结_南京大学高级程序设计-程序员宅基地

文章浏览阅读367次。南京大学高级程序设计期末复习总结,c++面向对象编程_南京大学高级程序设计

4.朴素贝叶斯分类器实现-matlab_朴素贝叶斯 matlab训练和测试输出-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏12次。实现朴素贝叶斯分类器,并且根据李航《统计机器学习》第四章提供的数据训练与测试,结果与书中一致分别实现了朴素贝叶斯以及带有laplace平滑的朴素贝叶斯%书中例题实现朴素贝叶斯%特征1的取值集合A1=[1;2;3];%特征2的取值集合A2=[4;5;6];%S M LAValues={A1;A2};%Y的取值集合YValue=[-1;1];%数据集和T=[ 1,4,-1;..._朴素贝叶斯 matlab训练和测试输出

Markdown 文本换行_markdowntext 换行-程序员宅基地

文章浏览阅读1.6k次。Markdown 文本换行_markdowntext 换行

错误:0xC0000022 在运行 Microsoft Windows 非核心版本的计算机上,运行”slui.exe 0x2a 0xC0000022″以显示错误文本_错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行-程序员宅基地

文章浏览阅读6.7w次,点赞2次,收藏37次。win10 2016长期服务版激活错误解决方法:打开“注册表编辑器”;(Windows + R然后输入Regedit)修改SkipRearm的值为1:(在HKEY_LOCAL_MACHINE–》SOFTWARE–》Microsoft–》Windows NT–》CurrentVersion–》SoftwareProtectionPlatform里面,将SkipRearm的值修改为1)重..._错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行“slui.ex