金三银四求职季,我特地为大家汇总了涵盖Java基础、线程、并发编程及JVM等核心领域的面试题集,希望能为正在准备或即将参与面试的小伙伴们提供些许帮助。
以下是本文精心挑选的15道Redis面试题。
主要是Redis的功能强大。
相较于其他缓存产品,Redis主要具备以下几个优势:
最近我给大家准备了一个关注领红包福利,欢迎大家加入我的技术交流群,一起抱团学习。一人走得更快,但是一群人才能走得更远。
首先,Redis使用了高度优化的数据结构和算法,比如跳跃表、压缩列表,在访问速度上进行了优化提升了性能。
其次,单线程避免了多线程中常见的上下文切换问题,减少了资源开销,专注干活。
另外,Redis使用了事件驱动的非阻塞IO机制,这意味着Redis能够在等待数据IO时不会阻塞主线程。(主线程负责执行命令)
以下是Redis的五种主要数据结构及其使用场景:
SET user:1001 "{ 'id': 1001, 'name': 'John Doe', 'age': 30 }"
。HSET user:1001 id 1001
,HSET user:1001 name "John Doe"
,HSET user:1001 age 30
。为了实现从键到值的快速访问,Redis 使用了一个全局哈希表来保存所有键值对。
哈希表的最大好处很明显,可以用 O(1) 的时间复杂度来快速查找到键值对。
Redis客户端执行一条命令需要4个步骤:
其中1和4花费的时间称为Round Trip Time (RTT,往返时间),也就是数据在网络上传输的时间,占用了绝大多的时间。所以才会有Redis性能瓶颈是网络这样的说法。
Pipeline机制能改善上面这类问题。在有需要的时候,客户端可以通过Pipeline一次性发送一组Redis命令,随后Redis再将这组命令的执行结果按顺序返回给客户端。这种方式可以减少网络上传输的时间,从而提高性能。
非Pipeline和Pipeline执行10000次set操作的效果,在执行时间上的比对如下
相比于Windows,Linux/Unix系统在稳定性、并发性上有一定优势,更适合Redis这种高性能数据库系统。提供Windows版本会消耗较多的资源。
Redis 提供两种持久化机制 RDB (Redis DataBase)和 AOF(Append-Only File)。
两者的优缺点也显而易见。
由于RDB是定时快照,所以当意外宕机后,就会丢失最后一次持久化之后的数据。而AOF以日志的形式追加到文件中,只会丢失最后一次的写操作数据,AOF数据安全性较高。也正是因为AOF会把所有的写操作记录下来,所以在重启恢复数据时会执行所有的写操作,数据恢复速度比RDB慢。
Redis 中的事务是一组命令的集合,将一组需要一起执行的命令放到multi和exec两个命令之间。multi 命令代表事务开始,exec命令代表事务结束。它可以保证一次执行多个命令,每个事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。
但是要注意Redis的事务功能很弱。在事务回滚机制上,Redis只能对基本的语法错误进行判断。
当语法命令错误时,会造成整个事务无法执行,事务内的操作都没有执行。
而当命令错误时,虽然有异常提示,但是事务会执行成功。
Redis 6.0引入多线程的主要原因是为了解决网络IO的性能瓶颈。
传统的单线程模型在处理大量网络请求时,只能串行处理,无法充分利用多核CPU的性能。所以,Redis 6.0引入了多线程,分别是主线程和IO线程。
主线程负责接收这些连接请求并分发给IO线程,IO线程负责读取和解析请求数据,随后将解析出的命令传递给主线程,由主线程负责执行这些命令。
所以,引入多线程主要是为了并行处理网络IO,命令执行仍然是单线程的。
这个问题可以移步至《面试官:如何在海量数据中快速检测某个数据》
渐进式rehash是Redis中一种用于对hash表进行扩容和缩容的操作方法。
通常在对hash表进行扩容时,需要一下几个步骤:
这中间会存在一个问题:如果要一次性把哈希表中的数据都迁移完,会造成 Redis 线程阻塞(在迁移期间要保证数据一致性,所以写操作会阻塞)。
为了避免阻塞,Redis在扩容时是这样操作的:
这样的话,就避免了一次性、集中式地完成rehash动作导致的长时间阻塞,影响用户体验。而在此期间,客户端访问数据时,会同时在两个hash表中查找数据,不会存在因迁移而导致数据不一致问题。
Redis的过期策略主要包括以下几种:
Redis的淘汰策略主要有以下几种:
当涉及到设置了过期时间的键时,还有以下策略:
BigKey是指在Redis中,某个key对应的value所占用的内存空间非常大。
如果value是字符串类型,最大可以达到512MB的存储空间。如果value是列表类型,最多可以存储2^32 - 1个元素。一般来说,超过10KB的value就可以被认为是字符串类型的BigKey。
BigKey带来的问题就是:操作BigKey比较耗时,可能导致Redis发生阻塞,从而降低Redis性能。在并发场景下,还会带来网络堵塞问题。
假设一个bigkey为1MB,每秒访问量为1000,每秒就会产生1000MB 的流量。对于普通的服务器来说简直是灭顶之灾。
这个问题可以移步至《面试官:你知道缓存击穿、缓存穿透、缓存雪崩吗?》
如果觉得这篇文章写的不错的话,不妨点赞加关注,我会更新更多技术干货、项目教学、经验分享的文章。