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

在 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。

⚠️ 注意 :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
相关推荐
wefg15 小时前
【Redis】初识 Redis
数据库·redis·缓存
周之瑞7 小时前
技术手记|Redis 与数据库事务不在一个世界:afterCommit、显式补偿还是 Canal?
redis
hacker_LeeFei8 小时前
Windows 下配置 Redis 8.10.2 开机自启:一次踩坑全记录
数据库·windows·redis
zl_dfq8 小时前
Redis 之 【持久化 与 事务】
数据库·redis
白露与泡影11 小时前
Redis 的“单线程”与“多线程”:一场关于性能与简洁的权衡
数据库·redis·php
行百里er15 小时前
Redis 性能优化——内存、慢查询、Big Key 与 Hot Key
redis·后端
yexianglunbai16 小时前
Redis 缓存详解:从原理到实战
数据库·redis·缓存
逃逸线LOF16 小时前
Redis快速入门
数据库·redis·缓存
j7~16 小时前
【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》
数据库·redis·缓存·redis的特性·redis的主要应用场景·redis重要文件及其作用·安装并启动redis
JavaEdge.16 小时前
Redis 连接断开后的自动重连操作
spring boot·redis·后端·lettuce·tcp keepalive