R

Redis 面试题

连载中

Redis 面试题:数据结构与底层实现、持久化、主从集群、缓存设计与分布式锁。

5 篇文章 开始阅读

教程目录

1

Redis 常见数据结构及使用场景?

一、String 最基础,存字符串/整数/二进制。场景:缓存、计数器(incr)、分布式锁(setnx)、限流。 二、List 双向链表。场景:消息队列(lpush/brpop)、最新列表。 三、Hash 键值对集合。场景:对象存储(用户信息)、购物车。 四、Set 无序去重集合。场景:标签、共同好

2

Redis 的持久化方式有哪些?

一、RDB(快照) 原理:在某个时间点把内存数据序列化写入 dump.rdb。 触发:save(阻塞)、bgsave(fork 子进程)、自动配置(save 900 1)。 优点:文件紧凑、恢复快。 缺点:可能丢失最后一次快照后的数据。 二、AOF(追加日志) 原理:把写命令追加到 appendon

3

缓存穿透、击穿、雪崩及解决方案?

一、缓存穿透 查询不存在的数据,缓存和数据库都没有,请求全打到数据库。 解决方案: - 缓存空值(设置较短过期时间)。 - 布隆过滤器,不存在的 key 直接拦截。 二、缓存击穿 热点 key 过期瞬间,大量并发请求打到数据库。 解决方案: - 互斥锁(setnx),只有一个请求查库并回填缓存。 -

4

Redis 如何实现分布式锁?

一、基本实现 SET lock_key unique_value NX EX 30 NX:key 不存在才设置。 EX:过期时间,防止死锁。 unique_value:释放锁时校验,防止误删别人的锁。 二、释放锁(Lua 脚本保证原子) if redis.call("get", KEYS[1])

5

Redis 为什么单线程还这么快?

一、核心原因 纯内存操作:数据在内存中,访问速度极快。 I/O 多路复用:用 epoll 处理大量并发连接,单线程也能处理高并发。 避免上下文切换:单线程没有线程切换开销,也没有锁竞争。 二、Redis 6.0 多线程 Redis 6.0 引入多线程,但只用于网络 I/O 的读写,命令执行仍是单线程