Redis 提供了丰富的数据类型,每种类型基于不同的数据结构设计,适用于特定的业务场景。以下是对 Hash、Set、List、String 和 ZSET(有序集合)的详细解析:
1. Hash 类型
数据结构特点
键值对的集合:
key是主键,value是包含多个字段(field)和值(value)的字典,即key: {field1: value1, field2: value2, ...}。底层实现:字段较少时使用压缩列表(ziplist),字段较多时切换为哈希表(hashtable),兼顾内存效率和访问速度。
典型应用场景
存储对象:例如商品详情(商品 ID 为 key,字段包含 name、price、stock 等),支持字段级操作。
HSET product:1001 name "iPhone 15" price 5999 stock 100 # 存储字段
HGET product:1001 price # 获取单个字段
HGETALL product:1001 # 获取所有字段
用户信息管理:用户 ID 为
key,存储username、email、create_time等字段。配置管理:存储系统配置项,支持动态更新部分字段。
核心操作命令
优势
字段级操作高效:无需序列化 / 反序列化整个对象,直接操作单个字段。
内存友好:字段较少时使用压缩列表,节省内存空间。
2. Set 类型
数据结构特点
无序、唯一的元素集合:元素不重复,支持 O (1) 时间复杂度的成员存在性检查。
底层实现:元素为整数时使用整数集合(intset),否则使用哈希表(hashtable)。
典型应用场景
集合运算:交集(
SINTER)、并集(SUNION)、差集(SDIFF),例如:共同好友:
SINTER user:1:friends user:2:friends获取两人的共同好友。标签筛选:通过交集筛选同时包含多个标签的商品。
去重与唯一性校验:统计网站独立访客(
SADD uv:20250412 user1 user2...,SCARD计算总数)。随机抽取:
SRANDMEMBER从集合中随机获取元素(如抽奖场景)。
核心操作命令
优势
天然支持集合运算:高效实现交集、并集、差集操作,适用于社交、推荐系统。
去重特性:自动过滤重复元素,避免冗余存储。
3. List 类型
数据结构特点
双向链表:有序、可重复,支持从头部(左)或尾部(右)插入 / 删除元素。
底层实现:元素较少时使用压缩列表(ziplist),较多时使用优化的双向链表(quicklist)。
典型应用场景
队列(FIFO):左进右出(
LPUSH+RPOP),用于任务队列、消息异步处理。栈(LIFO):左进左出(
LPUSH+LPOP),实现操作历史回溯。列表展示:按顺序存储数据,如最新评论(
LPUSH插入新评论,LRANGE 0 9获取前 10 条)。分页查询:通过
LRANGE key start end实现高效分页。
核心操作命令
优势
双向操作灵活:支持头部和尾部快速增删,适合队列、栈场景。
范围查询高效:
LRANGE直接通过索引定位,无需全量扫描。
4. String 类型
数据结构特点
最基础类型:存储字符串或二进制数据(最大 512MB),支持原子操作(保证操作的原子性)。
典型应用场景
简单键值对存储:缓存用户登录态(
SET user:1001:token abc123 ex 3600)。
计数器:利用 INCR/INCRBY 实现原子递增(如点赞数、接口调用次数)。
INCR post:1001:like # 点赞数+1
GET post:1001:like # 获取当前点赞数
分布式锁:通过
SETNX key value ex 10实现简单锁(仅当键不存在时设置)。位操作:
SETBIT/GETBIT存储二进制状态(如用户登录状态统计,BITCOUNT计算活跃用户数)。
核心操作命令
优势
适用范围广:支持字符串、数值、二进制数据,是缓存和计数器的首选。
原子性保证:所有操作均为原子性,确保并发场景下的数据一致性。
5. ZSET(有序集合)类型
数据结构特点
有序、唯一的元素集合:每个元素(member)关联一个 分数(score),按分数升序或降序排序。
底层实现:元素较少时用压缩列表(ziplist),较多时用跳表(skiplist)+ 哈希表(跳表保证有序,哈希表保证 O (1) 存在性检查)。
典型应用场景
排行榜 / 排名系统:实时更新用户分数排名(如游戏段位、销量榜),支持分数范围查询和排名获取。
ZADD rank:game 900 user:A 850 user:B # 插入分数
ZREVRANGE rank:game 0 9 WITHSCORES # 降序获取前10名及分数
带权重的任务队列:分数代表优先级,
ZPOPMAX/ZPOPMIN取出最高 / 最低优先级任务(Redis 6.2+)。时间线 / 最近访问记录:时间戳作为分数,
ZREVRANGE获取最近访问的 N 条记录。地理围栏:结合
GEORADIUS命令,按经纬度距离排序(本质是 ZSET 的扩展应用)。
核心操作命令
优势
有序性与唯一性结合:既保证元素不重复,又能按分数动态排序。
高效范围查询:跳表实现 O (log N) 时间复杂度的排名和范围查询。
动态更新友好:支持实时调整分数(如
ZINCRBY),自动重新排序。
总结对比
根据业务需求(如是否需要顺序、唯一性、复杂运算)选择合适的数据类型,可显著提升 Redis 的使用效率和性能。