温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Redis五大数据类型分别是什么

发布时间:2021-06-23 10:14:05 来源:亿速云 阅读:157 作者:chen 栏目:大数据
# Redis五大数据类型分别是什么 Redis作为高性能的键值存储系统,其核心优势之一在于丰富的数据类型支持。本文将全面解析Redis的五种基本数据结构:**String(字符串)**、**Hash(哈希)**、**List(列表)**、**Set(集合)**和**Sorted Set(有序集合)**,深入探讨每种类型的特性、底层实现、应用场景及操作命令。 --- ## 一、String(字符串) ### 1.1 基本特性 String是Redis最基础的数据类型,其特点包括: - **二进制安全**:可存储任何二进制数据(如图片、序列化对象) - **最大512MB**的单个值存储 - **数值操作**:支持对数值型字符串的原子性增减 ### 1.2 底层实现 Redis使用改进的**简单动态字符串(SDS)**结构: ```c struct sdshdr { int len; // 已用空间 int free; // 剩余空间 char buf[]; // 字节数组 }; 

相比C原生字符串的优势: - O(1)时间复杂度获取长度 - 杜绝缓冲区溢出 - 减少内存重分配次数(空间预分配+惰性释放)

1.3 常用命令

# 基础操作 SET key value [EX seconds|PX milliseconds] GET key # 数值运算 INCR key # 原子+1 INCRBY key 5 # 原子+5 DECR key # 批量操作 MSET k1 v1 k2 v2 MGET k1 k2 # 位图操作 SETBIT key offset 1 # 设置位 GETBIT key offset BITCOUNT key # 统计1的个数 

1.4 典型应用场景

  • 缓存系统:用户会话、页面缓存
  • 计数器:文章阅读量、商品库存
  • 分布式锁SET resource_name random_value NX PX 30000
  • 位图统计:用户签到记录、活跃用户分析

二、Hash(哈希)

2.1 结构特点

Hash类型相当于Java中的HashMap: - 字段值映射key -> {field1:value1, field2:value2} - 单个Hash可存储2^32-1个键值对 - 适合存储对象类型数据

2.2 底层实现

采用两种编码方式: 1. ziplist(压缩列表):当元素数量<512且所有value<64字节时使用 2. hashtable:不满足ziplist条件时自动转换

ziplist内存布局示例:

+---------+--------+-------+--------+ | zlbytes | zltail | zllen | entry1 | +---------+--------+-------+--------+ 

2.3 操作命令

# 字段操作 HSET user:1000 name "John" age 30 HGET user:1000 name HGETALL user:1000 # 批量操作 HMGET user:1000 name age HMSET product:100 price 399 stock 50 # 数值运算 HINCRBY user:1000 age 1 # 特殊操作 HKEYS user:1000 # 获取所有字段 HVALS user:1000 # 获取所有值 HLEN user:1000 # 字段数量 

2.4 应用场景

  • 用户属性存储:避免序列化整个对象
  • 商品信息缓存:独立修改不同字段
  • 配置中心:系统参数分组存储

三、List(列表)

3.1 数据结构特性

  • 双向链表结构,支持头部/尾部操作
  • 元素可重复
  • 最大长度2^32-1

3.2 底层实现

根据元素情况自动选择: 1. ziplist:元素数量<512且所有元素<64字节 2. linkedlist:不满足条件时转换 3. quicklist(Redis 3.2+):ziplist组成的双向链表

quicklist节点结构:

typedef struct quicklistNode { struct quicklistNode *prev; struct quicklistNode *next; unsigned char *zl; // 指向ziplist unsigned int count; // ziplist元素计数 } quicklistNode; 

3.3 常用命令

# 两端操作 LPUSH news:latest 1001 # 左侧插入 RPUSH news:latest 1002 # 右侧插入 LPOP news:latest RPOP news:latest # 范围操作 LRANGE news:latest 0 9 # 获取前10条 LINDEX news:latest 3 # 获取第4个元素 # 阻塞操作 BLPOP task_queue 30 # 阻塞30秒获取 

3.4 典型应用

  • 消息队列:LPUSH+RPOP组合
  • 最新列表:维护最新的N条记录
  • 分页查询:LRANGE实现分页
  • 栈/队列:LPUSH+LPOP/LPUSH+RPOP

四、Set(集合)

4.1 核心特性

  • 无序唯一的元素集合
  • 支持交并差集运算
  • 最大2^32-1个元素

4.2 底层实现

根据元素类型选择: 1. intset:当元素都是整数且数量<512时 2. hashtable:value为NULL的哈希表

intset结构示例:

typedef struct intset { uint32_t encoding; // 编码方式(int16/int32/int64) uint32_t length; // 元素数量 int8_t contents[]; // 元素数组 } intset; 

4.3 操作命令

# 集合操作 SADD tags:article:100 redis database SMEMBERS tags:article:100 SISMEMBER tags:article:100 redis # 集合运算 SINTER set1 set2 # 交集 SUNION set1 set2 # 并集 SDIFF set1 set2 # 差集 # 基数统计 SCARD tags:article:100 # 元素数量 

4.4 应用场景

  • 标签系统:文章标签管理
  • 好友关系:共同好友计算
  • 唯一计数器:UV统计
  • 黑白名单:快速查找过滤

五、Sorted Set(有序集合)

5.1 核心特点

  • 唯一成员+score排序
  • 范围查询效率高(O(logN))
  • 自动按score升序排列

5.2 底层实现

混合使用两种结构: 1. skiplist(跳跃表):支持范围操作 2. dict(字典):用于快速查找score

跳跃表节点结构:

typedef struct zskiplistNode { robj *obj; // 成员对象 double score; // 分值 struct zskiplistNode *backward; // 后退指针 struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[]; } zskiplistNode; 

5.3 操作命令

# 基本操作 ZADD leaderboard 95 "Alice" 87 "Bob" ZRANGE leaderboard 0 9 WITHSCORES # 前10名 ZREVRANK leaderboard "Alice" # 获取逆序排名 # 范围查询 ZRANGEBYSCORE salary 3000 5000 # 3000<=score<=5000 ZCOUNT salary 2000 4000 # 统计数量 # 集合运算 ZUNIONSTORE result 2 set1 set2 WEIGHTS 1 0.5 

5.4 典型应用

  • 排行榜系统:游戏积分榜
  • 延迟队列:score设为执行时间戳
  • 范围查找:价格区间筛选
  • 权重队列:优先级任务调度

六、类型选择最佳实践

6.1 选择依据

需求特征 推荐类型
简单键值对 String
对象属性存储 Hash
先进先出/后进先出 List
唯一性+集合运算 Set
排序+范围查询 Sorted Set

6.2 性能优化建议

  1. 控制Hash/List的元素数量和大小以避免ziplist转换
  2. 大批量操作使用Pipeline减少网络开销
  3. Sorted Set的score建议使用整数提升性能
  4. 定期监控大key(redis-cli --bigkeys

七、总结

Redis的五大数据类型构成了其强大的数据处理能力: - String:全能型选手,适用大多数简单场景 - Hash:结构化数据存储的最佳选择 - List:实现队列/栈等线性结构 - Set:高效处理唯一性需求 - Sorted Set:排序场景的不二之选

理解各类型的底层实现和特性,才能在实际业务中做出最优选择,充分发挥Redis的性能优势。 “`

该文档共计约4200字,采用Markdown格式编写,包含: - 详细的数据结构说明 - 底层实现原理图解 - 完整命令示例 - 典型应用场景分析 - 性能优化建议 - 格式化表格和代码块

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI