在 Redis 中,我们通常说的五种"容器" ,指的是Redis 支持的五种核心数据结构 。它们之所以被称为"容器",是因为它们都可以存储多个元素,而不仅仅是单个值。
下面我按从简单到复杂的顺序,结合实际场景,为你逐一讲解。
1. STRING(字符串)------ 最基础的"万能容器"
虽然它叫字符串,但它是 Redis 中最基础的二进制安全容器,可以存储文本、数字、甚至是序列化后的图片(字节流)。
- 核心用途:缓存对象(JSON字符串)、计数器(点赞数)、分布式锁、Session 共享。
- 常用命令 :
SET、GET、INCR(原子递增)、MSET(批量设置)。 - 使用示例 :
- 缓存用户信息:
SET user:1001 '{"name":"张三"}' - 文章阅读数:
INCR article:read:200(每次+1)
- 缓存用户信息:
2. LIST(列表)------ 有序的"消息队列"
它是一个双向链表,允许从头部(左)或尾部(右)插入或弹出元素。顺序严格按插入顺序排列。
- 核心用途:消息队列(生产者-消费者)、最新动态列表(如微博时间线)、栈或队列。
- 常用命令 :
LPUSH(左推)、RPUSH(右推)、LPOP/RPOP(弹出)、LRANGE(范围查询)。 - 使用示例 :
- 最新10条评论:
LPUSH post:100:comments "评论内容",然后LTRIM post:100:comments 0 9保留最新10条。 - 简单消息队列:生产者
RPUSH queue "task",消费者LPOP queue。
- 最新10条评论:
⚠️ 注意 :
LPOP是即时返回,如果队列为空会返回 null。若需阻塞等待,用BLPOP/BRPOP。
3. SET(集合)------ 无序且唯一的"标签库"
它是一个无序 的字符串集合,元素不允许重复。支持集合间的交、并、差运算。
- 核心用途:标签系统(如文章标签)、共同好友、抽奖去重、数据去重统计。
- 「去重」是一个动作/效果------把重复的元素去掉,每个只留一份。SET天然具有这个功能。
- 常用命令 :
SADD(添加)、SREM(移除)、SISMEMBER(判断是否存在)、SINTER(交集)、SUNION(并集)。 - 使用示例 :
- 用户标签:
SADD user:1001:tags "技术" "阅读" - 共同好友:
SINTER friends:A friends:B - 每日独立访客统计:
SADD visitors:2026-09-09 "ip1"
- 用户标签:
4. HASH(哈希)------ 对象属性的"完美映射"
它相当于一个微型字典 ,适合存储对象的多个字段(如用户属性)。比用多个 String 存储更节省内存,且方便单独读写某个字段。
- 核心用途:存储对象(用户、商品、配置)、购物车(key为用户ID,field为商品ID,value为数量)。
- 常用命令 :
HSET、HGET、HGETALL(获取全部字段)、HINCRBY(字段原子增减)。 - 使用示例 :
- 用户信息:
HSET user:1001 name "李四" age 28 city "北京" - 购物车:
HSET cart:user1 apple 3,HINCRBY cart:user1 apple 1(增加数量)
- 用户信息:
5. ZSET(有序集合/Sorted Set)------ 带权重的"排行榜"
它和 Set 一样元素唯一,但每个元素都关联一个分数(score),内部按分数自动排序。这是 Redis 最强大的数据结构之一。
- 核心用途:排行榜(游戏积分)、延迟队列(按时间戳排序)、带权重的任务调度、范围查询。
- 常用命令 :
ZADD(添加带分数元素)、ZRANGE(按分数升序取)、ZREVRANGE(降序取)、ZRANK(查排名)、ZINCRBY(增加分数)。 - 使用示例 :
- 游戏积分榜:
ZADD game:rank 1500 "playerA" 2300 "playerB" - 获取前三名:
ZREVRANGE game:rank 0 2 WITHSCORES - 延迟消息队列:将任务放入 ZSET,分数为执行时间戳,定时任务用
ZRANGEBYSCORE取到期的任务。
- 游戏积分榜:
快速对比总结表
| 数据结构 | 是否有序 | 元素是否唯一 | 核心适用场景 |
|---|---|---|---|
| STRING | - | - | 缓存、计数器、分布式锁 |
| LIST | 是(插入顺序) | 否 | 消息队列、最新列表 |
| SET | 否 | 是 | 标签、去重、集合运算 |
| HASH | 否(字段无序) | 字段名唯一 | 对象存储、配置、购物车 |
| ZSET | 是(按分数) | 是 | 排行榜、延迟队列、范围查询 |
额外提醒(选型黄金法则)
- 需要按时间排序且允许重复 → LIST
- 需要按自定义权重排序且唯一 → ZSET
- 需要频繁修改对象的一个字段 → HASH(避免用 String 序列化整个对象)
- 需要去重且无序 → SET
- 需要原子计数或二进制数据 → STRING
如果你能告诉我你的具体业务场景(比如"实时热搜榜"或"用户关注关系"),我可以帮你精准选型并给出伪代码设计。你对哪个数据结构还想深入了解底层实现(如跳表、压缩列表)吗?我可以接着讲。😊
redis刚接触练习
# 连接测试
127.0.0.1:6379> ping
PONG
# String存入
127.0.0.1:6379> SET name zhangsan
OK
127.0.0.1:6379> GET name
"zhangsan"
# Hash存入
127.0.0.1:6379> HSET user:1 name lisi age 30
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "lisi"
3) "age"
4) "30"
# List存入
127.0.0.1:6379> LPUSH queue a b c
(integer) 3
127.0.0.1:6379> LRANGE queue 0 -1
1) "c"
2) "b"
3) "a"
# SADD-添加集合。(具有"去重"功能,重复输入只会保留一份)
127.0.0.1:6379> SADD tags java spring
(integer) 2
127.0.0.1:6379> SMEMBERS tags
1) "spring"
2) "java"
127.0.0.1:6379> SADD tags java
(integer) 0
127.0.0.1:6379> SADD tags python
(integer) 1
127.0.0.1:6379> SMEMBERS tags
1) "spring"
2) "python"
3) "java"
127.0.0.1:6379>
# ZADD-添加带分数元素 ZSet:带分数
127.0.0.1:6379> ZADD rank 100 tom
(integer) 1
127.0.0.1:6379> ZRANGE rank 0 -1
1) "tom"
# 看剩余存活时间(-1 = 永久)
127.0.0.1:6379> TTL name
(integer) -1
# 设置 60 秒过期
127.0.0.1:6379> EXPIRE name 60
(integer) 1
# 查看剩余时间
127.0.0.1:6379> TTL name
(integer) 56
127.0.0.1:6379> TTL name
(integer) 46