一、Redis到底快在哪里?(必考题)
Redis的闪电速度不是偶然的!核心秘诀藏在三个关键设计:
- 纯内存操作:数据直接存在内存,没有磁盘IO瓶颈(但要注意内存爆满的问题)
- 单线程模型:避免上下文切换,配合多路复用技术(epoll)处理海量连接
- 数据结构优化:SDS字符串、跳跃表等结构都是为速度而生
举个真实案例:某电商平台把商品详情缓存到Redis后,QPS从200直接飙到8000+!(但要注意缓存穿透问题,后面会讲)
二、5大核心数据结构实战解析
2.1 String不只是字符串
- 计数器场景:
INCR user:1000:login_count - 分布式锁实现:
SETNX lock:order 1 EX 30 - (踩坑警告)大Value问题:曾经有个同事存了10MB的JSON,直接导致集群卡顿!
2.2 Hash的妙用
用户画像存储的正确姿势:
HSET user:1000 name "老王" age 35 tags "IT,美食"
HINCRBY user:1000 credits 50
(重要技巧)字段数不要超过500,否则性能急剧下降!
2.3 List实现消息队列的坑
虽然可以用LPUSH+BRPOP做简单队列,但:
- 没有ACK机制
- 不支持消费组
- 消息堆积会内存爆炸
(2024建议)需要可靠队列还是用Streams结构!
三、持久化方案生死抉择
3.1 RDB vs AOF 世纪对决
| RDB | AOF | |
|---|---|---|
| 持久化方式 | 定时内存快照 | 记录写操作日志 |
| 恢复速度 | 快(直接加载) | 慢(重放命令) |
| 数据安全 | 可能丢失分钟级数据 | 最多丢失1秒数据 |
| 文件大小 | 小 | 大(需定期重写) |
3.2 混合持久化实战配置
save 900 1
save 300 10
appendonly yes
aof-use-rdb-preamble yes # 混合模式神配置!
(血泪教训)曾经没开混合模式,AOF文件涨到50G,恢复花了2小时!
四、缓存三大灾难破解之道
4.1 缓存雪崩预防指南
- 随机过期时间:
EXPIRE key 3600 + random(600) - 热点key永不过期+后台更新
- 熔断降级机制(Hystrix走起)
4.2 缓存穿透终结方案
- 布隆过滤器拦截:
BF.ADD blacklist 12345 - 空值缓存:
SET null:key "" EX 60 - 接口鉴权加强(防恶意扫描)
4.3 热key发现与处理
某社交平台突发热搜事件导致Redis节点宕机,后来他们:
- 使用
redis-cli --hotkeys快速定位 - 本地缓存+多级缓存分流
- 关键key拆分:
hot:news:1001 -> hot:news:1001:shard1~shard10
五、集群模式深度探秘
5.1 主从复制全流程
- 从节点发送SYNC
- 主节点生成RDB
- 传输RDB文件
- 传输缓冲命令
- 持续同步
(注意陷阱)网络闪断会导致全量同步,记得调大repl-backlog-size
5.2 Redis Cluster实战
数据分片公式:HASH_SLOT = CRC16(key) mod 16384
节点通信采用Gossip协议,但节点数超过1000就会出问题!
部署建议:
- 至少3主3从
- 每个主节点配从节点
- 使用官方的redis-trib.rb工具
六、高级技巧与性能优化
6.1 管道技术提速30倍
普通模式:
for i in range(100):
r.get(i)
管道模式:
with r.pipeline() as pipe:
for i in range(100):
pipe.get(i)
results = pipe.execute()
6.2 内存优化神操作
- 使用ziplist编码:
hash-max-ziplist-entries 512 - 开启内存淘汰策略:
maxmemory-policy volatile-lru - 监控内存碎片率:
INFO memory(超过1.5要警惕)
七、刁钻面试题拆招
7.1 Redis为什么不用多线程?
经典问题!要这样回答:
- 单线程避免锁竞争
- 网络IO已通过多路复用优化
- 实际瓶颈在内存或网络
(加分项)提到Redis6的IO多线程特性!
7.2 如何实现分布式锁?
分步骤讲解:
- SETNX + EX 获取锁
- Lua脚本保证原子性
- 续期机制防止超时
- Redlock算法(有争议但要知道)
推荐Redisson实现,比手写靠谱10倍!
八、Redis7新特性速览
- Function特性:终于支持存储过程!
- ACL权限控制加强
- 新的sorted set命令:ZMPOP、BZMPOP
- 多线程IO正式版(谨慎开启)
最后的小故事
去年双十一,我们Redis集群扛住了200万QPS!但凌晨突然报警——某个主节点CPU飙到90%。紧急排查发现是有人用KEYS*查2000万key… 所以切记:生产环境禁用危险命令!
902

被折叠的 条评论
为什么被折叠?



