Redis 以 Key-Value 形式存储数据,其 Value 支持多种数据结构以适配不同业务场景。本文按类型梳理 String、Hash、List、Set 与 Zset 的核心特性、容量上限与常用命令,并结合示例说明适用场景,帮助你在实际开发中快速选型与正确使用。
String 字符串:基础存储与批量操作
String 是 Redis 最基本的数据类型。字符串是一组字节,在 Redis 中具有二进制安全(binary safe)特性,长度已知且不依赖终止字符,单个值最多可存储 512 MB 内容。二进制安全意味着操作函数仅按二进制数据存取,不关心具体字符串格式,从而避免数据损坏。
使用 SET 存储单个键值,GET 读取对应值:
127.0.0.1:6379> set website "www.biancheng.net" OK 127.0.0.1:6379> get website "www.biancheng.net"
需要一次性写入或读取多个键时,可使用 MSET 与 MGET 提升效率:
127.0.0.1:6379> MSET name www.biancheng.net topic Redis OK 127.0.0.1:6379> MGET name topic 1) "www.biancheng.net" 2) "Redis"
注意:上述数据类型均指 Value 的类型,而非 Key。
Hash 散列:对象字段映射与容量限制
Hash 是由字符串类型的 field 和 value 组成的映射表,可理解为包含多个键值对的集合,常用于存储对象。单个 Hash 最多可包含 2^32-1 个键值对。
使用 HMSET 可同时设置多个字段,HGETALL 用于查询全部字段:
127.0.0.1:6379> HMSET userid:1 username xiaoming password 123456 website www.biancheng.net OK 127.0.0.1:6379> HGETALL userid:1 1) "username" 2) "xiaoming" 3) "password" 4) "123456" 5) "website" 6) "www.biancheng.net"

图1:Redis Hash 类型演示
List 列表:有序可重复与队列实现
List 的元素为字符串类型,按插入顺序排列,允许重复,最多可插入 2^32-1 个元素(约 40 亿)。可通过 LPUSH 向头部(左侧)或 RPUSH 向尾部(右侧)添加元素,并遵循索引机制。
使用 LPUSH 连续插入元素,LRANGE 按索引范围查看:
127.0.0.1:6379> LPUSH biancheng Java (integer) 1 127.0.0.1:6379> LPUSH biancheng Python (integer) 2 127.0.0.1:6379> LPUSH biancheng C (integer) 3 127.0.0.1:6379> LPUSH biancheng SQL (integer) 4 127.0.0.1:6379> LPUSH biancheng Redis (integer) 5 127.0.0.1:6379> LPUSH biancheng Golang (integer) 6 127.0.0.1:6379> LRANGE biancheng 0 6 1) "Golang" 2) "Redis" 3) "SQL" 4) "C" 5) "Python" 6) "Java"
由于 LPUSH 从左侧插入,最后插入的元素位于列表最前,行为与栈/队列相似,适合实现消息队列或最近记录列表。
Set 集合:无序唯一与 O(1) 操作
Set 是由字符串元素构成的无序集合,底层通过哈希映射表实现,添加、删除与查找的时间复杂度均为 O(1)。集合成员具有唯一性,重复插入不会成功,最大容量同样为 2^32-1 个元素。
使用 SADD 添加元素,成功返回 1,已存在返回 0;SMEMBERS 查看集合内容:
127.0.0.1:6379> SADD www.biancheng.net HTML (integer) 1 127.0.0.1:6379> SADD www.biancheng.net Pandas (integer) 1 127.0.0.1:6379> SADD www.biancheng.net NumPy (integer) 1 127.0.0.1:6379> SADD www.biancheng.net Matplotlib (integer) 1 127.0.0.1:6379> SADD www.biancheng.net JS (integer) 1 127.0.0.1:6379> SADD www.biancheng.net HTML (integer) 0 127.0.0.1:6379> SADD www.biancheng.net HTML (integer) 0 127.0.0.1:6379> SMEMBERS www.biancheng.net 1) "Matplotlib" 2) "HTML" 3) "JS" 4) "Pandas" 5) "NumPy"
Zset 有序集合:分数排序与成员去重
Zset(sorted set)是有序集合,成员唯一且每个成员关联一个 double 类型的分数,分数允许重复。Redis 依据分数对成员进行排序。
使用 ZADD 添加成员与分数,成员已存在则添加失败(返回 0),分数可重复;ZSCORE 查看指定成员分数,ZRANGE 按索引范围查看排序后的成员:
127.0.0.1:6379> del biancheng (integer) 1 127.0.0.1:6379> zadd biancheng 0 Python (integer) 1 127.0.0.1:6379> zadd biancheng 1 Java (integer) 1 127.0.0.1:6379> zadd biancheng 2 C++ (integer) 1 127.0.0.1:6379> zadd biancheng 3 MySQL (integer) 1 127.0.0.1:6379> zadd biancheng 4 Redis (integer) 1 127.0.0.1:6379> zadd biancheng 4 Redis (integer) 0 127.0.0.1:6379> zadd biancheng 4 GOLANG (integer) 1 127.0.0.1:6379> ZSCORE biancheng Redis "4" 127.0.0.1:6379> zrange biancheng 0 4 1) "Python" 2) "Java" 3) "C++" 4) "MySQL" 5) "GOLANG" 6) "Redis"
数据类型选型与扩展类型说明
根据数据结构特征与业务需求,可参考以下选型建议:
- 简单键值或二进制数据缓存:使用 String,支持单值与批量操作,上限 512 MB。
- 对象属性存储:使用 Hash,字段独立可更新,适合用户资料、配置项等。
- 有序可重复序列或队列:使用 List,支持头部/尾部插入与索引访问。
- 去重集合与快速存在性判断:使用 Set,O(1) 复杂度,适合标签、好友关系等。
- 带权重的排行榜或时间线:使用 Zset,按分数排序且成员唯一。
除上述五种核心类型外,Redis 还支持 HyperLogLog 类型,以及 Redis 5.0 提供的 Stream 类型,后续章节将作进一步介绍。
在线练习工具:https://try.redis.io/
查看更多命令:https://redis.io/commands
