1. 核心概念
Redis 作为一个高性能的内存数据结构存储系统,在现代后端架构中扮演着“万金油”的角色。面试中被问到“项目中如何使用 Redis”时,不应只回答“做缓存”,而应结合具体业务场景,展示对 Redis 丰富数据结构的理解。
2. 常见业务场景
2.1 缓存(Cache)
- 场景:减轻数据库压力,提升热点数据读取速度。
- 实现:
- String:缓存 JSON 序列化的对象(如用户信息、商品详情)。
- Hash:缓存对象属性(如
HSET user:1001 name "Alice" age 18),便于单字段修改。
- 考量:需考虑缓存穿透、击穿、雪崩及数据一致性(双写/延迟双删/Canal)。
2.2 分布式锁(Distributed Lock)
- 场景:在分布式环境下,控制对共享资源的互斥访问(如秒杀扣库存、定时任务防重)。
- 实现:
- 简单版:
SET key value NX EX 10。 - 进阶版:使用 Redisson 框架(支持看门狗自动续期、可重入锁)。
- 简单版:
2.3 计数器与限流(Counter & Rate Limiter)
- 场景:视频播放量、点赞数、接口限流(1分钟访问100次)。
- 实现:
- INCR:原子递增,高性能统计播放量。
- ZSet/Lua:滑动窗口限流。
- Redis Cell:漏桶算法限流。
2.4 排行榜(Leaderboard)
- 场景:游戏积分榜、直播礼物榜、热搜话题。
- 实现:利用 Sorted Set (ZSet)。
ZADD rank:daily 100 user1(添加分数)ZREVRANGE rank:daily 0 9(获取前10名)
2.5 Session 共享(Session Sharing)
- 场景:分布式应用中,解决多实例间的 Session 不一致问题。
- 实现:Spring Session + Redis。将 Session 数据统一存储在 Redis 中,实现无状态服务。
2.6 消息队列(Message Queue)
- 场景:轻量级异步解耦(如发送验证码、日志处理)。
- 实现:
- List:
LPUSH+BRPOP(简单的阻塞队列)。 - Stream(5.0+):支持消费者组、消息持久化、ACK 机制,类似 Kafka。
- List:
2.7 位统计(Bitmap)
- 场景:用户签到(一年365天仅需365 bit)、在线状态、活跃用户统计。
- 实现:
SETBIT key offset value,BITCOUNT。
2.8 地理位置(Geo)
- 场景:附近的人、网约车距离计算。
- 实现:Redis GEO 模块(底层基于 ZSet)。
GEOADD:添加坐标。GEORADIUS:查询附近 5km 的人。
3. 总结
Redis 远不止是缓存。
面试回答示例:
“在我的项目中,Redis 主要用于以下几个场景:
- 核心缓存:缓存热点商品信息,降低 MySQL 压力。
- 分布式锁:使用 Redisson 实现跨服务的互斥控制,防止秒杀超卖。
- 计数器:利用
INCR原子性统计文章阅读量。- 排行榜:使用
ZSet维护每日活跃用户排行。- Session 共享:配合 Spring Session 实现分布式登录状态管理。 此外,我们还尝试过用 Bitmap 做用户签到,极其节省空间。”