Skip to content

Redis 常用场景与面试题

1. 为什么用 Redis?

  • 极高性能:单节点读写性能可达 10W+ QPS。
  • 丰富的数据类型:String, List, Set, Hash, ZSet (Sorted Set), Bitmap, HyperLogLog, Geo。
  • 丰富的特性:发布订阅、主从复制、Sentinel 哨兵、Cluster 集群。

2. Redis 的 5 种基本数据类型

  1. String (字符串)
    • 场景:缓存对象、计数器、共享 Session、分布式锁。
  2. Hash (哈希)
    • 场景:存储用户信息、购物车列表。
  3. List (列表)
    • 场景:消息队列(简单的消息队列)、朋友圈点赞列表。
  4. Set (集合)
    • 场景:去重统计(共同关注的人、共同喜好)、UV 统计。
  5. ZSet (有序集合)
    • 场景:排行榜(积分榜、贡献榜)、带权重的任务队列。

3. Redis 持久化:RDB vs AOF

RDB (Redis Database)

  • 原理:定时对内存数据进行“快照”并保存到磁盘。
  • 优点:启动恢复快,文件体积小,适合全量备份。
  • 缺点:可能丢失最近一次快照后的数据。

AOF (Append Only File)

  • 原理:将每一条写命令追加到 AOF 文件末尾。
  • 优点:数据一致性高(最多丢失 1s 数据),通过 rewrite 压缩文件。
  • 缺点:文件体积大,启动恢复慢,性能开销相对较高。

推荐配置:开启 RDB 做全量备份,开启 AOF 做增量恢复(混合持久化)。


4. 缓存三兄弟:穿透、击穿、雪崩

问题定义解决方案
缓存穿透查询一个不存在的数据,请求透传到 DB。布隆过滤器 (Bloom Filter)、空值缓存。
缓存击穿一个热点 Key 过期,瞬间大量并发请求到 DB。设置热点数据永不过期、互斥锁 (SETNX)。
缓存雪崩大量缓存同时过期,导致 DB 压力过大崩溃。设置随机过期时间、主从集群、限流。

5. 分布式锁:SETNX

  • 核心指令SET key value NX PX 30000
    • NX:仅在键不存在时设置。
    • PX:设置过期时间(防止进程宕机导致死锁)。
  • 释放锁:使用 Lua 脚本,确保“谁加锁谁释放”(验证 Value 匹配)。

6. Redis 为什么这么快?

  1. 基于内存操作:CPU 直接访问内存,省去磁盘 IO 延迟。
  2. 数据结构高效:各种数据结构专门针对性能进行了优化(如 SkipList)。
  3. IO 多路复用:单线程处理网络请求,通过 epoll 实现高性能网络通信。
  4. 单线程执行:避免了多线程带来的上下文切换和锁竞争(Redis 6.0 引入多线程处理网络请求,但核心逻辑依然单线程)。
最近更新