【面试题】Redis篇-常见面试题p1,jpa和mybatis的区别面试

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

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

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

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

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

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

正文

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

  1. Sorted Set

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

还有三种特殊的数据类型: 分别是 HyperLogLogs(基数统计), Bitmaps (位图) 和 geospatial (地理位置)

👨‍💻面试官追问:分别说说各个数据类型常用的使用场景?

  1. String
  • 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力

  • 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源

  • session:常见方案spring session + redis实现session共享

  1. List
  • 阻塞队列:Redis的lpush + brpop命令组合即可实现阻塞队列,生产者客户端是用lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的“抢"列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
  1. Hash
  • 缓存:哈希结构相对于字符串序列化缓存信息更加直观,而且更节省空间,并且在更新操作上更加便捷,所以常常用于缓存用户信息等。
  1. Set
  • 标签(tag):给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。

  • 点赞,或点踩,收藏等:可以放到set中实现

  1. zset
  • 排行榜:有序集合经典使用场景。例如小说,视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

4.说一下Redis常见的功能有哪些?


  1. 数据缓存功能

  2. 分布式锁的功能

  3. 支持数据持久化

  4. 支持事务

  5. 支持消息队列

5.说一下Redis的常用的使用场景?


  1. 缓存

减轻MySQL的查询压力,提升系统性能

  1. 排行榜

利用Redis的SortSet(有序集合)实现

  1. 计算器/限速器
  • 利用Redis 中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。

  • 限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力

  1. 好友关系

利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之类的功能

  1. 消息队列

除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如︰到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List 来完成异步解耦

  1. Session共享

Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆。采用Redis 保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息

6.说说Redis为什么这么快?


  1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速

  2. 数据结构简单,对数据操作也简单

  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

  4. 使用多路I/O复用模型,非阻塞IO

7.聊聊Redis为什么需要持久化?


Redis是个基于内存的数据库。那服务一旦宕机,内存中的数据将全部丢失。通常的解决方案是从后端数据库恢复这些数据,但后端数据库有性能瓶颈,如果是大数据量的恢复会有几个问题:

  1. 会对数据库带来巨大的压力

  2. 数据库的性能不如Redis。导致程序响应慢。

所以对Redis来说,实现数据的持久化,避免从后端数据库中恢复数据,是至关重要的。

8.说说Redis持久化的方式有哪些?


  1. RDB

快照的形式在指定的时间间隔内将内存中的数据集快照写入磁盘,可以指定时间归档数据,但不能做到实时持久化,RDB 持久化功能生成的 RDB 文件是经过压缩的二进制文件

  1. AOF

日志的形式记录服务器所处理的每一个写、删除操作(查询操作不会记录),以文本的方式记录,并在服务器启动时,通过重新执行这些命令来还原数据集。

  1. 混合持久化

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。混合持久化只发生于 AOF 重写过程。使用了混合持久化,重写后的新 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。

9.RDB和AOF两种持久化方式有什么优缺点?


  • RDB优点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高

  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景

  • RDB恢复数据的速度要比AOF快很多

  • RDB缺点

  • RDB方式实时性不够,无法做到秒级的持久化

  • 每次调用bgsave都需要fork子进程,fork子进程属于重量级操作,频繁执行成本较高

  • RDB文件是二进制的,没有可读性,AOF文件在了解其结构的情况下可以手动修改或者补全

  • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

  • AOF优点

  • AOF 比 RDB可靠,支持秒级持久化,就算发生故障停机,也最多只会丢失一秒钟的数据

  • 当 AOF文件太大时,Redis 会自动在后台进行重写。重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。当新文件重写完毕,Redis 会把新旧文件进行切换,然后开始把数据写到新文件上

  • AOF缺点

  • 对于相同的数据集,AOF 文件的大小一般会比 RDB 文件大

  • RDB 存储的是压缩二进制格式记录数据命令,AOF 是通过文本日志形式记录数据命令,所以采用 AOF 数据恢复比 RDB 慢

两者对比图:

img

10.触发RDB持久化的方式有哪些?


触发RDB持久化的方式有2种,分别是手动触发自动触发

手动触发

手动触发分别对应savebgsave命令

  • save命令

阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用

  • bgsave命令

Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短

img

自动触发

  • redis.conf中配置save m n,即在m秒内有n次修改时,自动触发bgsave生成rdb文件

  • 主从复制时,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点

  • 执行debug reload命令重新加载redis时也会触发bgsave操作

  • 默认情况下执行shutdown命令时,如果没有开启aof持久化,那么也会触发bgsave操作

11.AOF写数据有哪些策略?


一共有三种:

  1. always

每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用

  1. everysec

每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高 ,建议使用,也是默认配置。在系统突然宕机的情况下丢失1秒内的数据

  1. no

由操作系统控制每次同步到AOF文件的周期,整体过程不可控

12.说说什么是AOF重写?


随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是减少冗余指令。

👨‍💻面试官追问:AOF重写有什么好处?

  1. 降低磁盘占用量,提高磁盘利用率

  2. 提高持久化效率,降低持久化写时间,提高IO性能

  3. 降低数据恢复用时,提高数据恢复效率

👨‍💻面试官继续问:AOF重写有哪些规则?

  1. 进程内已超时的数据不再写入文件

  2. 忽略无效指令。重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令

  • 如del key1、 hdel key2、srem key3、set key4 111、set key4 222等
  1. 对同一数据的多条写命令合并为一条命令
  • 如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c

  • 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素

13.什么是缓存穿透?


缓存穿透

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

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

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

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

[外链图片转存中…(img-V5ev095T-1713289866267)]

[外链图片转存中…(img-4vtq0noY-1713289866268)]

[外链图片转存中…(img-KSFnmFEV-1713289866268)]

[外链图片转存中…(img-GXeIfCSL-1713289866269)]

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值