Redis常见面试题及答案(99%面试官必问必考)

Redis常见面试题及答案(99%面试官必问必考)-mikechen

Redis面试题是Java面试题经常考察的,下面就给大家总结了19道Redis常见面试题及答案@mikechen

1.概述你了解的Redis?

Redis,全称是Remote Dictionary Server,是一个开源的内存数据存储系统,它可以用作缓存、消息代理和数据存储。

Redis提供了以下功能和特点:

  • 速度快: Redis将数据存储在内存中,因此读写速度非常快。
  • 多种数据结构: Redis支持多种数据结构,如字符串、哈希、列表等。
  • 持久性: 可以将数据持久化到磁盘上,以便在重启后恢复数据。
  • 发布/订阅: 支持发布和订阅消息的模式。
  • 事务: 支持事务操作,通过MULTI、EXEC、WATCH等命令实现。
  • 集群: 支持分布式集群模式,提高了可用性和扩展性。

 

2.Redis的数据类型有哪些?

Redis支持多种数据类型,包括字符串、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。

如下图所示:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

  1. 字符串(String): 最基本的数据类型,可以存储任意类型的数据,如文本、数字等。可以执行字符串拼接、递增递减操作等。
  2. 哈希(Hash): 用于存储键值对集合,类似于关联数组。哈希适用于存储对象的属性集,每个字段代表一个属性,可以单独获取、修改或删除。
  3. 列表(List): 有序的字符串列表,可以在列表的头部或尾部进行添加、删除操作。可以用于实现消息队列、任务队列等。
  4. 集合(Set): 无序的字符串集合,不允许重复的元素。可以执行交集、并集、差集等操作,适用于数据去重、关联关系等场景。
  5. 有序集合(Sorted Set): 与集合类似,但每个成员都关联一个分数,可以用于排序。有序集合常用于排行榜、按分数范围获取数据等。
  6. 位图(Bitmap): 用于存储位级别的数据,可以进行位操作,如计数、统计等。位图通常用于记录用户签到、在线状态等。
  7. HyperLogLog: 用于基数估算(集合中不重复元素的数量),可以估算大规模数据的基数,占用空间相对较小。
  8. 地理空间(Geo): 用于存储地理位置信息和坐标,支持根据距离或位置获取附近的元素。

 

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

Redis提供两种主要的持久化方式,以确保数据在重启后不会丢失:

1.RDB(Redis Database)快照

RDB是一种将数据库的快照保存到磁盘上的持久化方式,在指定的时间间隔内,Redis将数据的快照保存到一个二进制文件中。

RDB优点:

  • 相对于AOF持久化,RDB文件较小,恢复速度较快。
  • 适用于数据的定期备份和迁移。

RDB缺点:

如果Redis崩溃,最后一次快照后的数据可能会丢失。

 

4.什么是Redis哨兵?

Redis Sentinel(哨兵)是Redis的高可用性解决方案,用于监控、管理和自动故障转移Redis主从复制环境中的节点。

如下图所示:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

Redis哨兵提供了以下功能:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

1.监控

负责监控redis master和slave进程是否正常工作。

2.通知

如果redis实例有故障,报警通知给管理员。

3.自动故障转移

当 主节点 不能正常工作时,Sentinel 会开始一次 自动的 故障转移操作。

4.配置提供者

如果故障转移发生了,通知client客户端新的master地址。

 

5.什么是Redis主从复制?

Redis主从复制是一种数据复制机制,通过该机制,Redis可以将一个节点的数据自动复制到其他节点。

如下图所示:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

在Redis主从复制中,有两个关键角色:

  1. 主节点(Master): 主节点是数据的源头,负责处理写操作和更新数据。主节点将其数据发送给从节点,以便从节点保持与主节点数据的一致性。
  2. 从节点(Slave): 从节点复制主节点的数据,负责处理读操作。从节点通过复制主节点的数据,实现数据的备份和读取分担。

 

6.Redis主从复制的原理?

主从复制的工作流程如下:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

  1. 从节点连接到主节点,并发送SYNC命令。
  2. 主节点将快照(RDB)或AOF文件中的数据发送给从节点,用于初始化从节点的数据。
  3. 主节点将写操作发送给从节点,从节点根据写操作来保持与主节点数据的一致性。

 

7.什么是Redis集群?

Redis集群是一个分布式的Redis环境,用于将数据分片存储在多个节点上,以提高数据处理能力、容量和可用性。

如下图所示:

Redis常见面试题及答案(99%面试官必问必考)-mikechen

当我们的存取的时候Redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽。

 

8.什么是Redis事务?如何实现事务操作?

Redis事务是一系列操作的集合,可以一次性执行并确保这些操作在执行期间不会被其他客户端中断。

事务通过MULTI、EXEC、WATCH等命令实现,如下所示:

MULTI
SET key1 "value1"
SET key2 "value2"
GET key1
GET key2
EXEC

在这个示例中,MULTI开始了事务,然后通过SET命令将两个键的值设置为”value1″和”value2″,然后使用GET命令获取这两个键的值。

最后,EXEC执行事务,如果所有命令成功执行,那么GET命令将返回键的值。

 

9.Redis的数据淘汰策略有哪些?

Redis有以下几种数据淘汰策略:

  • LRU(最近最少使用): 移除最近最少使用的键。
  • LFU(最不经常使用): 移除使用频率最低的键。
  • TTL(过期时间): 移除已过期的键。
  • 随机: 随机选择要移除的键。

 

10.如何实现分布式锁?

Redis可以通过使用SETNX(SET if Not eXists)命令来实现简单的分布式锁。

// 尝试获取锁
SETNX lock_key 1

// 设置锁的过期时间,防止长时间持有锁
EXPIRE lock_key 10

// 执行业务逻辑
// ...

// 释放锁
DEL lock_key
  • 使用SETNX设置锁时,如果操作成功(返回1),表示成功获取锁。如果操作失败(返回0),表示锁已被其他客户端持有。
  • 要避免锁过期时间设置过短,以防止业务逻辑未执行完就释放了锁。
  • 使用DEL命令删除锁键时,要确保只有锁的持有者才能删除,以避免误删。

 

11.Redis的发布/订阅模式是什么?

发布/订阅模式是Redis的一种消息传递模式,允许多个客户端订阅一个或多个频道,同时可以向这些频道发布消息。订阅者将在有新消息发布到频道时收到通知。

 

12.什么是缓存雪崩和缓存击穿?如何防止它们?

缓存雪崩: 大量缓存同时失效,导致大量请求直接打到数据库上,引起数据库压力剧增。

缓存击穿: 单个缓存失效,而恰好此时有大量请求访问该键,导致大量请求直接打到数据库上。

防止缓存雪崩的方法包括设置随机的过期时间,使用多级缓存等。防止缓存击穿的方法包括设置互斥锁,使用布隆过滤器等。

 

13.Redis和Memcached有什么区别?

两者的区别主要分为如下4点:

1)数据结构支持的区别

Redis: Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它更适合处理复杂的数据操作。

Memcached: Memcached只支持简单的键值对结构,不支持复杂的数据类型。

2)持久性支持的区别

Redis: Redis支持数据的持久化,可以将数据保存到磁盘上,以便在重启后恢复数据。

Memcached: Memcached不支持数据的持久化,数据在内存中,重启后数据会丢失。

3)复制和分片的区别

Redis: Redis支持主从复制和分片,可以实现高可用性和扩展性。

Memcached: Memcached没有内置的复制和分片功能,需要通过第三方库或自己实现。

4)性能和功能的区别

Redis: Redis在某些情况下性能稍逊于Memcached,但它提供更多的功能,如事务、发布/订阅、持久性等。

Memcached: Memcached在性能方面相对更优,但功能相对较少。

 

14.什么是缓存击穿?如何防止缓存击穿?

缓存击穿是指一个非常热门的缓存键失效,导致大量请求直接访问数据库。

为了防止缓存击穿,可以使用布隆过滤器预先判断键是否存在,或者在缓存失效前更新缓存。

 

15.如何处理Redis中的并发访问问题?

可以使用事务、乐观锁、分布式锁等方法来处理并发访问问题。

 

16.如何将Redis应用于实时排行榜?

可以使用有序集合数据结构来存储分数和成员,根据分数进行排名。

 

17.如何使用Lua脚本在Redis中执行复杂操作?

可以使用EVAL命令来执行Lua脚本,这可以在一次通信中实现多个命令。

 

18.Redis的过期策略是什么?

在Redis中,有两种主要的过期策略:

  1. 定时删除: 在设置键的过期时间时,Redis会使用定时器来监视键的过期时间,并在键的过期时间到达时删除它。这种策略适用于需要精确控制键的生存时间的情况。
  2. 惰性删除: 在键被访问时,Redis会检查键是否过期,如果过期则将其删除。这种策略可以避免定时删除的性能开销,但也可能导致过期键在一段时间内仍然存在于数据库中。

 

19.Redis的性能瓶颈有哪些?

Redis的性能瓶颈通常有以下几个方面:

  1. 内存: Redis是基于内存的数据库,因此内存容量可能成为性能瓶颈。如果数据量超过可用内存,就会导致内存交换,从而影响性能。
  2. 单线程: Redis使用单线程模型来处理请求,这可能在高并发情况下成为瓶颈,尤其是在执行复杂计算或大量I/O操作时。
  3. 持久化: 在持久化过程中,RDB快照和AOF日志都可能导致性能下降,特别是在生成快照时。
  4. 网络延迟: 如果客户端与Redis之间的网络延迟较高,会影响请求响应时间。
  5. 键的数据类型和大小: 某些数据类型,特别是大型哈希或列表,可能会导致性能问题,尤其是在进行部分读写操作时。

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

评论交流
    说说你的看法