您好,登录后才能下订单哦!
# 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格式编写,包含: - 详细的数据结构说明 - 底层实现原理图解 - 完整命令示例 - 典型应用场景分析 - 性能优化建议 - 格式化表格和代码块
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
开发者交流群:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/niyueling/blog/3111367