Redis基础——五种核心数据结构(“容器”)

在 Redis 中,我们通常说的五种"容器" ,指的是Redis 支持的五种核心数据结构 。它们之所以被称为"容器",是因为它们都可以存储多个元素,而不仅仅是单个值。

下面我按从简单到复杂的顺序,结合实际场景,为你逐一讲解。


1. STRING(字符串)------ 最基础的"万能容器"

虽然它叫字符串,但它是 Redis 中最基础的二进制安全容器,可以存储文本、数字、甚至是序列化后的图片(字节流)。

  • 核心用途:缓存对象(JSON字符串)、计数器(点赞数)、分布式锁、Session 共享。
  • 常用命令SETGETINCR(原子递增)、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

⚠️ 注意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为数量)。
  • 常用命令HSETHGETHGETALL(获取全部字段)、HINCRBY(字段原子增减)。
  • 使用示例
    • 用户信息:HSET user:1001 name "李四" age 28 city "北京"
    • 购物车:HSET cart:user1 apple 3HINCRBY 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
相关推荐
载数而行5208 小时前
redis集群
redis
云雀衔光12 小时前
多个 MCP Server 怎么编排:数据库 / Redis / Git / 飞书一把梭
java·数据库·人工智能·redis·git·语言模型·飞书
youm200313 小时前
【学习笔记】reids的数据类型
redis·笔记·学习
三8441 天前
redis防御加固与安全基线
数据库·redis·安全·应急响应·防御
SendTomo1 天前
【技术交流】从0到1构建一个汉字学习平台:汉字吧(hanzi8.com)的技术架构猜想
redis·mysql·nginx·php·个人开发
右耳朵猫AI1 天前
Go周刊2026W36 | Go 1.27.1 发布、TinyGo 0.42、HTTP/2 原生迁入 net/http、quic-go 0.62
redis·http·golang
莫得感情 o1 天前
Redis 09 · 高可用:Sentinel 如何发现故障并完成切主
redis·缓存·sentinel
考虑考虑1 天前
Redis8.8新特性
运维·redis·后端
tryxr2 天前
Redis 的背景知识
数据库·redis·缓存