Redis常见面试题目及进阶

103 阅读3分钟

Redis 数据类型

  1. String: 简单的字符串。
  2. Hash: 哈希表,键值对集合。
  3. Set: 无序集合。
  4. ZSet (Sorted Set): 有序集合。排行榜使用。
  5. List: 链表。
  6. Bitmap: 位图。
  7. HyperLogLog: 基数估计算法。
  8. Geo: 地理位置数据。

Redis 为什么这么快

  1. 单线程,非阻塞的 I/O 多路复用机制: Redis 使用单线程模型和 I/O 多路复用技术(如 epoll),避免了线程上下文切换的开销。
  2. 纯内存: 所有数据都存储在内存中,读写速度极快。
  3. 高效数据结构: Redis 使用了很多高效的数据结构,如字典、跳表等。
  4. 持久化机制: 提供 RDB 快照和 AOF 持久化机制。
  5. 优化网络通信: Redis 使用了高效的网络通信模型,基于非阻塞的I/O多路复用技术(如epoll)。

epoll 是什么

epoll 是 Linux 系统中的一种事件通知机制,用于在高并发网络编程中实现 I/O 多路复用。相比于 select 和 poll,epoll 提供了更高效的事件通知机制,避免了轮询的开销,提高了系统的性能和并发能力。

零拷贝

零拷贝(Zero Copy)是一种计算机编程技术,旨在减少数据在内存之间移动的次数,提高数据处理的效率和性能。更多详情见链接

压缩数组

图像压缩领域使用。Redis 中使用了整数字符串依然使用整数表示。

Redis 的事务

弱事务。

Redis 的集群模式

  1. 单机
  2. 主从
  3. 主从加哨兵
  4. 集群(多副本)

Redis 的持久化机制

  1. RDB (二进制文件)
  2. AOF(所有的写命令)

Redis 的缓存穿透、缓存击穿、缓存雪崩

  1. 延迟双删
  2. 缓存穿透: 不存在的数据
  3. 缓存击穿: 过期或者删除的数据
  4. 缓存雪崩: 大量数据同时过期

Redis 布隆过滤器

只能确定一定没有,但不能确定一定有,存在一定误判率。Redis 使用 String 结构实现。

Redis 分布式锁

  1. 红锁
  2. 锁续期问题: 更多详情见链接链接

Redis 什么时候阻塞,大键怎么处理?

Redis 主要在以下情况下可能阻塞:

  1. 使用阻塞命令: 如 BLPOP、BRPOP 等命令在列表为空时会阻塞。
  2. 数据迁移或重分配: 在 Redis 集群中,当槽位数据迁移或故障转移时,相关的键可能暂时无法访问。
  3. 持久化操作: 如果使用磁盘持久化(如 RDB 快照),在高数据负载下可能导致主线程短暂阻塞。
  4. 大量命令或大键处理: 大键处理(如大哈希表、大列表等)可能会占用较长的 CPU 时间,导致其他命令延迟响应。

处理大键的一些策略:

  1. 避免大键的产生: 尽可能设计避免大键的数据结构。
  2. 定期检查和分析: 使用 SCAN、HSCAN 等命令定期检查键的大小。
  3. 渐进式处理: 对于需要删除的大键,分多次小批量删除部分元素,避免一次性删除大键带来的阻塞。

Redis 的 cluster 槽为啥是 16384

Redis 槽位的数量为 16384,因为这是一个 2 的 14 次方,便于二进制位运算,能够在保证负载均衡的同时避免额外开销。

Redis 的 list 能实现一个队列,Redis 还支持持久化,为啥一般不作为消息中间件

  1. 没有消息确认机制。
  2. 没有消息投递保证。
  3. 设计初衷不是为了消息中间件。