文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
- 这时线程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持久化的方式有两种,一种是RDB持久化,一种是AOF持久化。
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全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。当重启Redis时会重新将持久化的日志中文件恢复数据。
由于AOF记录的是命令,所以AOF文件比RDB文件大得多。并且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。
如:
set num Tom;
set name Jack;
set name Lucy;
最后记录的name是Lucy
也可以通过执行bgrewriteof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的效果
如 mset Tom Jack Lucy;
当然AOF的命令记录的频率也可以通过redis.conf文件来配
-
Always 同步刷盘,可靠性高,几乎不会丢失数据,就是会影响性能;
-
everysec 每秒刷盘,性能适中,最多丢失1秒的数据;
-
no 由操作系统控制,性能是最好的,但可靠性比较差,可能丢失大量数据。
优点:
1.保存数据安全,AOF持久化可以配置appendfsync属性为always,每进行一次操作,命令就会被记到AOF文件中。
2.如果在写文件时突然服务器宕机,可以用redis-check-aof工具解决一致性问题。
3.AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令。
缺点
1.AOF文件较大,并且恢复速度慢(因为恢复时需要执行一遍命令才能恢复)
2.数据集大的时候,比RDB启动效率低。
RDB和AOF都有各种的优缺点,如果对数据安全性要求高,在实际开发中往往会结合两者来使用。
持久化方式:
RDB定时对整个内存做快照;而AOF记录每一次执行的命令;
数据完整性:
RDB不完整,两次备份之间会丢失数据;AOF相对完整,取决于刷盘策略;
文件大小:
最后
分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。
面试经验技巧篇
- 经验技巧1 如何巧妙地回答面试官的问题
- 经验技巧2 如何回答技术性的问题
- 经验技巧3 如何回答非技术性问题
- 经验技巧4 如何回答快速估算类问题
- 经验技巧5 如何回答算法设计问题
- 经验技巧6 如何回答系统设计题
- 经验技巧7 如何解决求职中的时间冲突问题
- 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
- 经验技巧9 在被企业拒绝后是否可以再申请
- 经验技巧10 如何应对自己不会回答的问题
- 经验技巧11 如何应对面试官的“激将法”语言
- 经验技巧12 如何处理与面试官持不同观点这个问题
- 经验技巧13 什么是职场暗语
面试真题篇
- 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
- 真题详解2 某知名社交平台软件工程师笔试题
- 真题详解3 某知名安全软件服务提供商软件工程师笔试题
- 真题详解4 某知名互联网金融企业软件工程师笔试题
- 真题详解5 某知名搜索引擎提供商软件工程师笔试题
- 真题详解6 某初创公司软件工程师笔试题
- 真题详解7 某知名游戏软件开发公司软件工程师笔试题
- 真题详解8 某知名电子商务公司软件工程师笔试题
- 真题详解9 某顶级生活消费类网站软件工程师笔试题
- 真题详解10 某知名门户网站软件工程师笔试题
- 真题详解11 某知名互联网金融企业软件工程师笔试题
- 真题详解12 国内某知名网络设备提供商软件工程师笔试题
- 真题详解13 国内某顶级手机制造商软件工程师笔试题
- 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
资料整理不易,点个关注再走吧
真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
[外链图片转存中…(img-PERgSi17-1715647145898)]
资料整理不易,点个关注再走吧