一句话总括:
Redis 不仅是缓存,更是高性能的内存数据结构服务,常用于缓存、计数、锁、排行榜、限流、消息队列、Session 管理等场景。
一、最常用:缓存(Cache)✅
典型用法
-
热点数据缓存(商品详情、用户信息、配置)
-
减轻 MySQL 压力
-
提升接口响应速度
请求 → Redis(命中)→ 返回
请求 → Redis(未命中)→ MySQL → 写回 Redis → 返回
常配策略
- 过期时间(TTL)
- 淘汰策略(LRU / LFU)
- 缓存预热 / 缓存更新(旁路缓存)
✅ 面试说:
我们用 Redis 做业务热点数据的缓存,把 MySQL 中频繁读取但很少变更的数据放到 Redis,设置合理 TTL,显著降低数据库压力。
二、计数器 / 自增 ID(String / INCR)✅
典型场景
- 文章阅读量
- 点赞数
- 接口调用次数
- 每日 UV 粗略统计
css
INCR article:view:1001
✅ 原子操作,高并发安全,不需要加锁
三、分布式锁(你刚学过的)✅
典型场景
- 秒杀扣库存
- 定时任务只跑一次(多实例)
- 防止重复提交
sql
SET lock:order:123 uuid NX PX 30000
✅ 配合 Lua 脚本解锁 + 锁续期
四、排行榜 / 排行榜 TopN(ZSet)✅
典型场景
-
积分排行榜
-
销量排名
-
最近活跃度
ZADD rank 95 user_1
ZREVRANGE rank 0 9 WITHSCORES
✅ 自动按 score 排序,O(log N)
五、集合类(Set / Hash)✅
Set 场景
- 共同好友
- 标签
- 已读 / 点赞去重
- 抽奖(SRANDMEMBER)
Hash 场景
-
用户信息对象
-
购物车(Hash 比 String 更语义化)
HSET cart:uid1 sku_1 2
HINCRBY cart:uid1 sku_1 1
六、限流(Rate Limit)✅ 加分点
固定窗口(简单)
bash
INCR limit:ip:127.0.0.1
EXPIRE limit:ip:127.0.0.1 60
滑动窗口(高级)
- 用 ZSet 记录时间戳
- 或 Redis-Cell(令牌桶)
✅ 面试加分说:
我们在网关层用 Redis 做接口限流,防止恶意刷接口,比如每 IP 每分钟最多 100 次。
七、Session / Token 存储 ✅
典型场景
- 登录 Session(Spring Session Redis)
- JWT / OAuth 的黑名单/白名单
- 验证码(手机验证码 + TTL)
markdown
SETEX sms:138****0000 300 123456
八、消息队列 / 发布订阅(了解即可)✅
List(简单队列)
arduino
LPUSH queue task1
RPOP queue
或 BRPOP(阻塞)
Pub/Sub(通知 / 广播)
- 订单创建通知
- 实时提醒
⚠️ 说明:
- Redis Stream 更接近真正 MQ
- 关键业务建议用 Kafka / RabbitMQ
- Redis MQ 适合轻量、可丢消息场景
九、Bitmap / HyperLogLog(数据分析类)✅ 加分
- Bitmap:签到、日活统计
r
SETBIT sign:20240101 uid 1
BITCOUNT sign:20240101
-
HyperLogLog:UV 去重估算
PFADD uv:20240101 user_1
PFCOUNT uv:20240101
🎙️ 面试标准口述版(推荐背这个)
Redis 在我们项目里用途比较多,不止是缓存。
最常见是做热点数据缓存,减轻 MySQL 压力;
其次用 INCR 做计数器,比如阅读量、点赞数;
用 SET NX 实现分布式锁,防止多实例并发问题;
ZSet 做排行榜,Set 做去重和标签,Hash 存对象或购物车;
也用 Redis 做接口限流、存储登录验证码和 Session;
在轻量场景会用 List / Stream 做简单消息队列,Bitmap 做签到统计。
不同场景会选不同的数据结构,而不只是当 KV 缓存用。
✅ 面试官想听的重点(打分点)
| 他希望你说到 | 你有没有 |
|---|---|
| 不只会说缓存 | ✅ |
| 能对应数据结构 | ✅ |
| 有真实业务场景 | ✅ |
| 知道 Redis 不是万能 MQ | ✅ |
| 能顺带提缓存问题(穿透/锁) | ✅(你已有) |