Redis 常用数据结构及其对应的业务场景(总结)

发布于:2025-03-27 ⋅ 阅读:(25) ⋅ 点赞:(0)

1. String(字符串)

特点:最简单的键值对结构,可存储文本、数字或二进制数据(最大 512MB)。
适用场景

  • 缓存:存储用户信息、页面片段、商品详情等(如 SET user:1 "{name: 'Alice', age: 30}")。

  • 计数器:文章阅读量、点赞数(INCR article:1001:views)。

  • 分布式锁:通过 SETNX 实现简单锁机制。

  • 限速控制:如短信验证码发送频率(EXPIRE phone:138xxxx 60)。


2. Hash(哈希表)

特点:键值对集合,适合存储对象。
适用场景

  • 对象存储:用户属性(HSET user:1001 name "Bob" age 25),避免序列化开销。

  • 购物车:以用户ID为Key,商品ID为Field,数量为Value(HINCRBY cart:user1 item:123 1)。

  • 配置管理:存储系统的动态配置项。


3. List(列表)

特点:有序、可重复元素,支持双向操作(LPUSH/RPUSH)。
适用场景

  • 消息队列:简单版生产者消费者模型(LPUSH tasks "task1"RPOP tasks)。

  • 最新动态:朋友圈时间线(LPUSH feed:user1 "post:789",保留最近 N 条)。

  • 分页查询:文章评论列表(LRANGE comments:1001 0 9)。


4. Set(集合)

特点:无序、唯一元素,支持交并差集操作。
适用场景

  • 标签系统:文章标签(SADD article:1001:tags "tech" "redis")。

  • 好友关系:共同关注(SINTER user:1001:follows user:1002:follows)。

  • 去重统计:UV(独立访客)计算(SADD daily_uv "user1" "user2")。


5. Sorted Set(有序集合)

特点:元素按分数(Score)排序,唯一且可范围查询。
适用场景

  • 排行榜:游戏积分榜(ZADD leaderboard 1000 "player1"ZREVRANGE leaderboard 0 9)。

  • 延迟队列:用时间戳作为 Score,到期处理任务(ZADD delay_queue <timestamp> "task")。

  • 范围查询:价格区间内的商品(ZRANGEBYSCORE products 100 200)。


6. HyperLogLog(基数统计)

特点:极低内存估算大规模去重计数(误差约 0.81%)。
适用场景

  • UV统计:统计每日访问用户数(PFADD daily_uv "user1" "user2"PFCOUNT daily_uv)。


7. Bitmap(位图)

特点:通过位操作存储布尔值,节省空间。
适用场景

  • 签到打卡:记录用户每月签到(SETBIT sign:user1:202303 3 1 表示第3天签到)。

  • 特征标记:用户是否拥有某权限(位偏移代表权限ID)。


8. GEO(地理空间)

特点:基于 Sorted Set 实现地理位置查询。
适用场景

  • 附近的人:存储坐标并查询半径内的地点(GEOADD locations 116.40 39.90 "Beijing"GEORADIUS locations 116 39 100 km)。


9. Stream(流)

特点:持久化消息队列,支持消费者组。
适用场景

  • 事件溯源:订单状态变更日志(XADD orders * event "created" id 123)。

  • 异步任务:类似 Kafka 的轻量级消息队列。


选择建议:

  • 需要排序 → Sorted Set

  • 需要去重 → Set

  • 存储对象 → Hash

  • 高频读写 → String

  • 顺序性任务 → List 或 Stream

合理选择数据结构能显著提升性能和代码简洁性。例如,用 Hash 代替 String 存储对象可减少网络传输量,用 Sorted Set 实现排行榜比手动排序更高效。