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)

  • 场景:轻量级异步解耦(如发送验证码、日志处理)。
  • 实现
    • ListLPUSH + BRPOP(简单的阻塞队列)。
    • Stream(5.0+):支持消费者组、消息持久化、ACK 机制,类似 Kafka。

2.7 位统计(Bitmap)

  • 场景:用户签到(一年365天仅需365 bit)、在线状态、活跃用户统计。
  • 实现SETBIT key offset valueBITCOUNT

2.8 地理位置(Geo)

  • 场景:附近的人、网约车距离计算。
  • 实现:Redis GEO 模块(底层基于 ZSet)。
    • GEOADD:添加坐标。
    • GEORADIUS:查询附近 5km 的人。

3. 总结

Redis 远不止是缓存。

面试回答示例:

“在我的项目中,Redis 主要用于以下几个场景:

  1. 核心缓存:缓存热点商品信息,降低 MySQL 压力。
  2. 分布式锁:使用 Redisson 实现跨服务的互斥控制,防止秒杀超卖。
  3. 计数器:利用 INCR 原子性统计文章阅读量。
  4. 排行榜:使用 ZSet 维护每日活跃用户排行。
  5. Session 共享:配合 Spring Session 实现分布式登录状态管理。 此外,我们还尝试过用 Bitmap 做用户签到,极其节省空间。”