一、Redis究竟是个啥?能吃吗?
(敲黑板)Redis可不是数据库界的萌新!这个用C语言写的内存选手,早就是分布式系统的扛把子了。单线程架构?别慌!人家用IO多路复用照样玩转10万+QPS(没想到吧)。常见的使用场景我都给你列好了:
- 缓存突击队:扛住MySQL的第一波冲击
- 计数狂魔:点赞/UV统计一把梭
- 消息队列备胎:当Kafka临时掉链子时
- 会话管家:分布式登录状态管理
- 实时排行榜:游戏玩家的噩梦排行榜
二、数据结构面试灵魂拷问
2.1 String不止是字符串!
你以为的String:
SET name "老王"
实际上的String(骚操作):
SET counter 100
INCR counter // 原子计数神器!
SETBIT daily_login 5 1 // 位图统计登录
2.2 Hash表的花式用法
用户信息存储的正确姿势:
HSET user:1001 name "张三" age 28 score 95.5
(重要!!)相比String全量存储,Hash可以精准修改单个字段,内存节省高达50%!
2.3 有序集合ZSet的隐藏技能
直播间打赏排行榜实战:
ZADD ranking 9999 "主播A" 8888 "主播B"
ZREVRANGE ranking 0 9 WITHSCORES // TOP10立马呈现
底层跳表结构(skiplist)才是速度担当,查询复杂度O(logN)稳如老狗!
三、持久化面试终极对决:RDB vs AOF
3.1 RDB快照流
SAVE // 同步保存(生产环境慎用!)
BGSAVE // 后台保存的正确姿势
优点:
- 恢复速度堪比闪电侠
- 二进制文件体积小
缺点预警!!!
- 可能丢失最后几分钟数据
- fork子进程时内存双倍暴击
3.2 AOF日志派
开启姿势:
appendonly yes
appendfsync everysec // 推荐配置
重写机制(AOF瘦身术):
BGREWRITEAOF // 后台重写命令
混合持久化(Redis4.0+必杀技):
RDB头 + AOF尾,鱼和熊掌我都要!
四、缓存三大灾难现场
4.1 缓存雪崩(集体阵亡)
场景还原:
某电商凌晨批量更新缓存,结果全部设置5分钟过期…(画面太美)
解决方案三板斧:
- 随机过期时间:
基础时间 + 随机值
- 永不过期策略+异步更新
- 熔断限流保命(Hystrix搞起)
4.2 缓存穿透(疯狂怼DB)
恶意查询不存在的key?布隆过滤器教做人!
(代码实战)Guava布隆过滤器:
BloomFilter<String> filter = BloomFilter.create(
Funnels.stringFunnel(), 1000000, 0.01);
注意!!!布隆过滤器有1%误判率,记得兜底校验数据库
4.3 缓存击穿(热key暴毙)
解决方案双保险:
- 互斥锁(Redis的SETNX)
- 逻辑过期时间(物理不过期)
五、集群方案华山论剑
5.1 主从复制(基础版)
SLAVEOF 192.168.1.100 6379 // 从节点配置
缺点预警:写操作还是单点,主挂全挂!
5.2 Sentinel哨兵(高可用版)
三大监控任务:
- 主节点心跳检测
- 自动故障转移
- 配置中心通知
5.3 Cluster集群(终极形态)
数据分片原理(槽位分配):
16384个slot,每个节点负责部分区间
迁移命令:
CLUSTER ADDSLOTS 0 1 2 3 ... 5000
六、管道 vs 事务
6.1 管道(Pipeline)
批量操作性能提升秘籍:
pipe = r.pipeline()
for i in range(100):
pipe.set(f'key{i}', i)
pipe.execute()
速度提升10倍不是梦!
6.2 事务(弱鸡版ACID)
MULTI
SET a 100
SET b 200
EXEC
注意!!!Redis事务没有回滚,语法错误全不执行,运行时错误继续执行
七、性能优化魔鬼细节
7.1 内存优化三把刀
- 合理使用ziplist编码
- 控制Hash的
hash-max-ziplist-entries
- 定期检查大key(
redis-cli --bigkeys
)
7.2 网络优化必杀技
- 避免超大value(超过10KB要警惕)
- 连接池配置(最大连接数不是越大越好)
- 慎用KEYS命令(用SCAN替代)
八、附加题:Redis底层探秘
8.1 跳表(ZSet核心)
插入过程动态图:
(想象多层索引结构,查询时从上往下跳)
8.2 渐进式rehash
Hash表扩容时,采用分步迁移策略,避免长时间阻塞
8.3 LFU算法(Redis4.0+)
淘汰策略配置:
maxmemory-policy allkeys-lfu
计数器衰减机制防止历史数据长期霸占内存
看完这篇,Redis面试官都得喊你一声大哥!(记得实操练习,别光收藏吃灰)遇到奇葩面试题?评论区等你来战!