Redis专题面试题总结

1.Redis支持哪些数据类型?简单描述每种类型的使用场景

String:最基本类型,可存储文本、二进制数据(如图片)。使用场景:缓存、计数器(如INCR)、分布式锁(SETNX)。

List:双向链表,支持头尾操作。使用场景:消息队列(LPUSH/RPOP)、最新消息列表。

Hash:键值对集合,适合存储对象。使用场景:用户信息(如HSET user:1 name "Alice")、商品属性。

Set:无序唯一集合,支持交并差操作。使用场景:共同好友(SINTER)、标签系统。

ZSet(Sorted Set):有序集合,元素按分数排序。使用场景:排行榜(ZADD)、延迟队列(按时间戳排序)。

Bitmaps:位操作,节省空间。使用场景:用户在线状态、活跃统计。

HyperLogLog:基数统计(去重计数)。使用场景:UV统计(误差约0.81%)。

Streams:消息流,支持消费者组。使用场景:日志收集、事件溯源。

String:SDS(简单动态字符串),预分配内存减少频繁分配。

List:QuickList(Redis 3.2+),由多个ziplist组成的双向链表,平衡内存和性能。

Hash:ziplist(小数据)或哈希表(数据量大时自动转换)。

ZSet:跳表(SkipList) + 哈希表,跳表支持快速范围查询,哈希表保证O(1)单元素访问。

2.Redis是如何实现持久化的?请比较下Redis持久化方式的优缺点

RDB(快照):

原理:定时生成内存数据的二进制快照(SAVE/BGSAVE)。

优点:恢复速度快,文件紧凑适合备份。

缺点:可能丢失最后一次快照后的数据,大数据量时BGSAVE会占用额外内存。
AOF(Append-Only File):

原理:记录所有写操作命令(fsync策略:always/everysec/no)。

优点:数据安全性高(always模式最多丢失一个命令)。

缺点:文件体积大,恢复速度慢,重写(BGREWRITEAOF)时可能阻塞。
混合持久化(Redis 4.0+):

原理:RDB + AOF,AOF文件包含RDB头部和增量命令。

优点:结合两者优势,恢复速度快且数据完整。

3.描述一下Redis发布/订阅模型的工作原理及其应用场

工作原理:

发布者通过PUBLISH发送消息到频道,订阅者通过SUBSCRIBE订阅频道。

无持久化:消息实时传递,离线订阅者无法获取历史消息。

应用场景:实时聊天、事件通知(如订单状态更新)。

底层实现:

使用字典dict保存频道与订阅者列表的映射,订阅者通过链表连接。键为频道名 (sds字符串),值为订阅该频道的客户端链表

4.Redis的事务是如何工作的?Redis事务与传统数据库事务有何不同?

命令:MULTI(开启)、EXEC(执行)、DISCARD(取消)、WATCH(乐观锁)。

1、特点:

命令队列:事务中的命令按顺序执行,但不会回滚(即使某条命令失败)。

无隔离性:其他客户端命令可能在事务执行期间插入。

2、与传统事务区别:不支持ACID中的原子性(部分失败不会回滚)和隔离性。

3、WATCH通过监视Key的版本号实现乐观锁,若Key被修改则事务失败。

5.在高并发环境下,如何避免Redis的热点问题?如何解决BigKey问题?

热点问题:
分片 :将数据分散到多个节点(如CLUSTER KEYSLOT)。
本地缓存 :在应用层缓存热点数据(如Guava Cache)。
随机过期时间 :避免大量Key同时失效。
BigKey问题:

定义:Value 过大(如String > 10KB,集合元素 > 5000 )。

解决:
拆分 :将大Key拆分为多个子Key(如user:1:friends拆分为user:1:friends:part1)。
压缩 :使用Snappy压缩Value。
异步删除:使用UNLINK代替DEL避免阻塞。

6.请描述一种使用Redis实现分布式锁的方法。

加锁操作

java 复制代码
SET resource_name unique_value NX EX 30//unique_value:唯一标识(如 UUID),用于安全释放锁。

解锁操作,通过 Lua 脚本保证原子性(检查值 + 删除):

java 复制代码
if redis.call("get", KEYS[1]) == ARGV[1] then
    return redis.call("del", KEYS[1])
else
    return 0
end

Redisson实现:

使用看门狗(Watchdog)自动续期锁,防止业务未完成锁过期。

7.如何使用Redis构建一个高效的排行榜系统?

使用ZSet:

添加分数:ZADD leaderboard 1000 "user1"。

获取排名:ZREVRANGE leaderboard 0 9 WITHSCORES(前10名)。

底层:跳表支持O(log N)的插入和范围查询。

8.Redis的Key和Value的设计原则有哪些?

Key设计:简短且有意义(如user:1:profile)、避免特殊字符。

Value设计:选择合适的数据类型(如用Hash代替多个String存储对象)。控制大小,避免BigKey。

9.Redisson锁有哪些优点? Redisson如何实现分布式锁?

优点:

1、可重入性,实现细节:使用 Redis 的 Hash 结构存储锁信息,Key 为锁名称,Field 为客户端唯一标识(UUID + 线程ID),Value 为重入次数。

2、自动续期(Watchdog 机制)

3、公平锁,联锁,红锁

4、高性能与低竞争
发布订阅机制 :客户端通过订阅 Redis 频道监听锁释放事件,而非轮询查询锁状态,减少 Redis 压力。
Lua 脚本原子性 :所有加锁、解锁、续期操作均通过 Lua 脚本保证原子性,避免竞态条件。

5、高可用、灵活性

10.解释一下Redisson watchdog机制? watchdog 什么情况续期? 什么情况停止续期? watchdog一直续期客户端挂了怎么办?watchdog遇到解锁失败的情况下,会不会导致一直续期下去?

续期条件:锁未被释放且客户端正常。

停止续期:锁释放或客户端宕机。

客户端宕机:锁自动过期,不会无限续期。

解锁失败:若解锁脚本执行失败(如网络问题),客户端会 标记锁为已释放状态,并 停止 Watchdog 的续期线程。

锁的 TTL 会自然递减直至过期,最终被 Redis 自动删除,不会无限续期。

客户端进程崩溃:

Watchdog 线程随客户端进程终止而停止,锁的 TTL 不再被续期,最终自动过期。

11.什么是Redis管道(pipelining)?如何通过管道提高性能?

Redis 管道(Pipelining)是一种客户端技术 ,允许将多个命令一次性发送到服务器 ,而无需等待每个命令的单独响应。

服务器会按顺序处理 这些命令,并将所有结果一次性返回 给客户端。核心目的是减少网络往返时间 (RTT),从而显著提升批量操作的性能。

原理:将多个命令打包发送,减少网络往返时间(RTT)。

适用场景:

1、批量写入:如初始化缓存、批量插入用户数据。

2、批量读取:如获取多个 Key 的值。

3、无依赖命令:命令之间无顺序依赖,例如同时设置多个独立 Key。

优化技巧:

1、分批发送 :若命令数量极大(如 10 万条),将命令分批次发送(如每批 1000 条),避免服务器内存溢出。

2、异步管道 :在异步框架(如 Python 的 asyncio)中,结合非阻塞 IO 进一步优化吞吐量。

3、压缩命令:对重复性命令(如相同结构的 HSET)进行压缩,减少传输数据量。

12.Redis的内存管理机制是什么?介绍几种常用的内存淘汰策略。

淘汰策略

java 复制代码
noevictio:拒绝所有写入操作(默认策略)	数据不可丢失,允许读操作
allkeys-lru:从所有键中淘汰最近最少使用(LRU)的键	热点数据分布明显
volatile-lru:从设置了过期时间的键中淘汰LRU键	需区分临时数据和永久数据
allkeys-lfu:从所有键中淘汰最不经常使用(LFU)的键	高频访问数据需长期保留(Redis 4.0+)
volatile-lfu:从设置了过期时间的键中淘汰LFU键	临时数据中区分高频/低频(Redis 4.0+)
allkeys-random:随机淘汰任意键	无明确访问规律
volatile-random:从设置了过期时间的键中随机淘汰	临时数据无规律
volatile-ttl:淘汰剩余存活时间最短(TTL)的键	优先清理即将过期的数据
注:带(4.0+)标记的策略需Redis 4.0及以上版本支持。

13.Redis有哪些常用的数据结构?除了使用Redis锁还有哪些

1、String(字符串):SDS

2、List(列表):QuickList(Redis 3.2+),由多个压缩列表(ziplist)链接的双向链表。

3、Hash(哈希表):小数据用ziplist(内存紧凑),大数据转哈希表(dict)。

4、Set(集合):整数集合(intset)或哈希表。

5、ZSet(有序集合):跳跃表(SkipList) + 哈希表,支持O(log N)范围查询。

14.解释一下什么是缓存穿透、缓存雪崩、缓存击穿?

穿透:查询不存在的数据(解决:布隆过滤器)。(封锁ip最常用)

雪崩:大量Key同时过期(解决:随机过期时间)。

击穿:热点Key失效后大量请求打到数据库(解决:互斥锁(不常用))。

15.redis的服务器端是单线程还是多线程?为什么?

单线程:处理命令、网络IO(6.0后引入多线程IO,但命令执行仍单线程)。

原因:避免锁竞争,内存操作快速,通过IO多路复用处理高并发。

16.redis同步到数据库,为什么用延迟双删,怎么保证一致性

1、删除缓存。

2、更新数据库。

3、延迟再次删除缓存(如1秒后)。

目的:避免主从延迟期间的脏数据。

17.如何基于Redis实现分布式锁?有哪些优缺点?

优点

高性能:基于内存操作,加锁/解锁速度极快(微秒级)。

实现简单:仅需 Redis 基础命令,适合快速集成。

灵活性:支持设置锁的过期时间,适应不同业务场景。

可重入性(通过 Redisson):同一线程可重复获取锁。
缺点

单点故障风险:

单节点 Redis 宕机时锁失效(需集群或 RedLock 缓解)。

案例:若主节点宕机且未持久化,从节点可能丢失锁信息。

锁超时问题:

业务处理时间超过锁过期时间,导致锁提前释放(需 Watchdog 续期)。

极端场景:客户端 A 因 GC 暂停释放锁,客户端 B 获取锁后,A 恢复并继续操作资源。

网络分区问题:

脑裂时可能出现多个客户端持有锁(如 Redis 主从切换)。

客户端阻塞:

大量客户端重试抢锁可能导致 Redis 性能下降。

18.Redis中支持哪些过期策略?

过期策略

1、惰性删除(Lazy Expiration)

触发时机:在访问键时检查是否过期。

执行流程:客户端尝试读取某个键。Redis 检查该键的过期时间。

若已过期,立即删除键并返回空值;若未过期,返回数据。

优点:对 CPU 友好,只在访问时消耗资源。

缺点:若大量过期键长期未被访问,会占用内存(内存泄漏风险)。

2、定期删除(Active Expiration)

触发时机:由 Redis 的定时任务 serverCron 周期性执行(默认每秒 10 次,可通过 hz 配置)

执行流程:每次随机抽取一定数量的键(默认 20 个)检查是否过期。删除已过期的键。

若过期键比例超过 25%,重复步骤 1,直到比例低于 25% 或超时(默认 25ms)。

优点:减少内存泄漏风险。

缺点:可能无法完全清理所有过期键,需结合惰性删除。

3、内存回收触发删除

在内存不足时,若启用淘汰策略,Redis 会优先清理过期键。

19.Redis中Key过期了一定会立即删除吗?

不一定立即删除:可能等待定期删除或惰性删除。

20.Redis中有一批Key瞬间过期之后,为什么其他Key的读写效率会降低?

问题:Redis忙于删除Key,阻塞其他操作。

解决:分散过期时间(如基础时间 + 随机偏移)。

21.ZSet为什么使用跳表实现?

跳表:插入、删除、查询均为O(log N),实现简单,易于范围查询。

对比平衡树:跳表更易实现,且并发性能更好。

22.Redis执行慢是什么原因?怎么尽可能的避免?

原因:BigKey操作、内存淘汰频繁、持久化阻塞、复杂命令(如KEYS *)。

优化:避免BigKey,使用SCAN代替KEYS。

升级到多线程IO(Redis 6.0+)。分片集群分散压力。

相关推荐
风吹迎面入袖凉1 天前
【Redis】Redis的五种核心数据类型详解
java·redis
NineData1 天前
NineData 智能数据管理平台新功能发布|2026 年 3 月
数据库·oracle·架构·dba·ninedata·数据复制·数据迁移工具
小陈工1 天前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
❀͜͡傀儡师1 天前
k8s部署的Nexus 3 数据库损坏恢复指南:从删除损坏数据库到完整数据重建
数据库·kubernetes·nexus3
StackNoOverflow1 天前
Spring Security权限控制框架详解
java·数据库·sql
不愿透露姓名的大鹏1 天前
Oracle归档日志爆满急救指南
linux·数据库·oracle·dba
a里啊里啊1 天前
Redis面试题记录
数据库·redis·缓存
数据知道1 天前
claw-code 源码分析:OmX `$team` / `$ralph`——把 AI 辅助开发从偶发灵感变成可重复流水线
数据库·人工智能·mysql·ai·claude code·claw code
__土块__1 天前
大厂后端一面模拟:从线程安全到分布式缓存的连环追问
jvm·redis·mysql·spring·java面试·concurrenthashmap·大厂后端
麦聪聊数据1 天前
企业数据流通与敏捷API交付实战(六):内部API门户与自助分发机制
数据库·低代码·restful·etl