# 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)时间复杂度获取长度 - 杜绝缓冲区溢出 - 减少内存重分配次数(空间预分配+惰性释放)
# 基础操作 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的个数
SET resource_name random_value NX PX 30000
Hash类型相当于Java中的HashMap
: - 字段值映射:key -> {field1:value1, field2:value2}
- 单个Hash可存储2^32-1个键值对 - 适合存储对象类型数据
采用两种编码方式: 1. ziplist(压缩列表):当元素数量<512且所有value<64字节时使用 2. hashtable:不满足ziplist条件时自动转换
ziplist内存布局示例:
+---------+--------+-------+--------+ | zlbytes | zltail | zllen | entry1 | +---------+--------+-------+--------+
# 字段操作 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 # 字段数量
根据元素情况自动选择: 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;
# 两端操作 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秒获取
根据元素类型选择: 1. intset:当元素都是整数且数量<512时 2. hashtable:value为NULL的哈希表
intset结构示例:
typedef struct intset { uint32_t encoding; // 编码方式(int16/int32/int64) uint32_t length; // 元素数量 int8_t contents[]; // 元素数组 } intset;
# 集合操作 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 # 元素数量
混合使用两种结构: 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;
# 基本操作 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
需求特征 | 推荐类型 |
---|---|
简单键值对 | String |
对象属性存储 | Hash |
先进先出/后进先出 | List |
唯一性+集合运算 | Set |
排序+范围查询 | Sorted Set |
redis-cli --bigkeys
)Redis的五大数据类型构成了其强大的数据处理能力: - String:全能型选手,适用大多数简单场景 - Hash:结构化数据存储的最佳选择 - List:实现队列/栈等线性结构 - Set:高效处理唯一性需求 - Sorted Set:排序场景的不二之选
理解各类型的底层实现和特性,才能在实际业务中做出最优选择,充分发挥Redis的性能优势。 “`
该文档共计约4200字,采用Markdown格式编写,包含: - 详细的数据结构说明 - 底层实现原理图解 - 完整命令示例 - 典型应用场景分析 - 性能优化建议 - 格式化表格和代码块
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。