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

发布时间:2021-06-23 10:14:05 作者:chen
阅读:142
开发者专用服务器限时活动,0元免费领! 查看>>
# 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 典型应用场景


二、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 数据结构特性

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 典型应用


四、Set(集合)

4.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 应用场景


五、Sorted Set(有序集合)

5.1 核心特点

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 典型应用


六、类型选择最佳实践

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格式编写,包含: - 详细的数据结构说明 - 底层实现原理图解 - 完整命令示例 - 典型应用场景分析 - 性能优化建议 - 格式化表格和代码块

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. 云计算的五大核心技术分别是什么
  2. Activiti五大特点分别是什么

开发者交流群:

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

原文链接:https://my.oschina.net/niyueling/blog/3111367

redis

上一篇:怎么用Pragma来废弃API

下一篇:面向对象中的开闭原则是什么

相关阅读

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

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