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 实现排行榜比手动排序更高效。