文章目录
一、Redis为什么快得飞起?(底层架构剖析)
Redis的"秒回"性能可不是玄学!核心原理要搞懂:
-
纯内存操作(这点超重要)
数据直接放在内存里读写,相比磁盘IO快几个量级。不过要注意内存管理策略,比如最大内存设置和淘汰策略(这个后面会重点讲) -
单线程模型避坑指南
Redis 6.0之前是纯单线程处理命令,好处是避免了线程切换开销和锁竞争。但要注意:- 复杂命令会导致阻塞(比如keys *)
- 大value会拖慢整个服务
- 网络IO在6.0之后改用多线程了
-
IO多路复用黑科技
采用epoll/kqueue机制,用1个线程管理上万个连接。就像餐厅服务员用对讲机同时处理多个包厢的点餐需求,效率直接拉满!
二、数据结构不只是五虎将(高阶用法)
别只会说string/list/hash/set/zset!面试官想听的是实际应用:
2.1 字符串的骚操作
- 位图统计:用户签到用SETBIT,省内存到极致
- 分布式锁:SETNX+过期时间+唯一值(防误删)
- 计数器:INCR原子操作做阅读量统计
2.2 HyperLogLog实战
做UV统计误差率0.81%,存储百万数据只要12KB。但要注意:
PFADD uv:20231001 user123
PFCOUNT uv:20231001
不能获取单个用户信息,适合大数据量去重
2.3 GEO地理位置
外卖App常用场景:
GEOADD restaurants 116.397128 39.916527 "海底捞"
GEORADIUS restaurants 116.400000 39.900000 5 km
三、持久化方案选择困难症(RDB vs AOF)
3.1 RDB快照
- 优点:全量备份、恢复快、适合灾备
- 坑点:fork子进程可能导致瞬间卡顿,数据丢失风险
3.2 AOF日志
- 优点:数据更安全,支持秒级持久化
- 痛点:文件体积大,恢复速度慢
3.3 混合持久化(Redis4.0+)
配置这么写:
aof-use-rdb-preamble yes
重启时先加载RDB快照,再追增AOF日志,鱼和熊掌兼得!
四、缓存三大经典问题(附解决方案)
4.1 缓存穿透
恶意请求不存在的数据,导致直接打到DB。解决方案:
- 布隆过滤器拦截
- 缓存空对象(记得设置短过期时间)
4.2 缓存雪崩
大量key同时过期,DB直接挂掉。应对措施:
- 随机过期时间:基础过期时间+随机偏移量
- 热点数据永不过期+异步更新
- 集群部署+限流降级
4.3 缓存击穿
某个热点key过期瞬间,高并发请求压垮DB。必杀技:
- 互斥锁(分布式锁)
- 逻辑过期(物理不过期)
五、Redis分布式锁的正确姿势
5.1 基本实现
SET lock_key unique_value NX PX 30000
但这样还不够!要考虑:
- 锁续期(看门狗机制)
- 可重入性
- 集群环境下的Redlock争议
5.2 推荐方案
直接用Redisson框架,已经帮你封装好了:
RLock lock = redisson.getLock("orderLock");
lock.lock();
try {
// 业务代码
} finally {
lock.unlock();
}
六、高频面试题攻防战
最近帮学员复盘时整理的必问题型:
- 缓存和数据库一致性如何保证?(先更库还是先删缓存?)
- 大Key怎么处理?(渐进式删除方案)
- Redis集群方案如何选择?(Codis vs Cluster)
- Pipeline和事务的区别?(原子性 vs 批量操作)
- 内存淘汰策略怎么选?(allkeys-lru还是volatile-ttl?)
七、面试加分项(实战经验包装)
教你如何把项目经验说出花:
- 说场景:“我们电商系统的秒杀模块用Redis做了库存预扣”
- 讲问题:“遇到过大Value导致集群节点内存不均”
- 解决方案:“采用hash分桶存储,拆分成多个field”
- 量化成果:“QPS从2000提升到15000,内存节省40%”
八、避坑指南(血泪教训)
- 禁用KEYS命令(用SCAN替代)
- 监控慢查询(slowlog get 10)
- 主从分离时,maxmemory不要设置一样
- 集群模式下慎用事务(只支持同一slot)
- 警惕内存碎片(info memory看mem_fragmentation_ratio)
九、最新趋势(2023+)
面试官最近爱问的新考点:
- Redis支持多线程了?什么原理?
- RedisJSON模块的应用场景
- 函数计算(Redis7.0的Function特性)
- 无盘复制(diskless replication)原理
- 客户端缓存(Client-side caching)
十、备战建议(突击路线)
最后7天冲刺方案:
- 重点突破:持久化+集群+缓存方案
- 模拟面试:找伙伴互相出场景题
- 刷题网站:LeetCode+牛客网Redis专题
- 源码阅读:至少掌握一个核心模块(比如dict实现)
- 实战演示:准备本地环境,现场演示事务操作
准备Redis面试就像打游戏升级装备,既要基础扎实,又要懂版本新特性。记住:原理讲透+场景说清+方案落地=offer到手!最后提醒各位,Redis水很深,本文提到的每个知识点都能展开讲半小时,建议根据目标公司的技术栈重点突破。