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
相关推荐
xiaoqiMikko15 小时前
Redis 实战(二):宕机会丢多少数据 —— kill -9 与真断电下 RDB / AOF 逐个实测(6.2.4)
redis·后端
夕除17 小时前
redis--ziplist
redis
2301_322414280419 小时前
基于SSM框架的在线考试管理系统的设计与实现14750-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·redis·mysql·tomcat·maven·mybatis·ssm
我星期八休息19 小时前
Redis 的原理和使用(2)
前端·数据库·redis·python·mysql·缓存·bootstrap
imDwAaY2 天前
操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2
android·java·redis
码途行者2 天前
处理超时未支付订单:两套轻量化方案,附 PHP 极简实现
开发语言·redis·php
草莓熊Lotso2 天前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
我不会起名字3222 天前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
我不会起名字3222 天前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
毕业设计7033 天前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm