Redis 数据类型与核心命令详解:从 String 到 ZSet

Redis 数据类型与核心命令详解:从 String 到 ZSet

admin
2026-07-24 / 0 评论 / 0 阅读

前言

Redis 是目前最流行的内存数据库,凭借极高的读写性能和丰富的数据结构,被广泛应用于缓存、消息队列、分布式锁等场景。本文将系统讲解 Redis 的五大核心数据类型及其常用命令,帮助你快速上手。

一、Redis 数据类型总览

数据类型底层结构典型应用场景
StringSDS(简单动态字符串)缓存、计数器、分布式锁
Hashziplist / hashtable对象存储、用户信息
Listquicklist(ziplist + 链表)消息队列、文章列表
Setintset / hashtable标签、共同好友、去重
ZSetziplist / skiplist + hashtable排行榜、延迟队列

二、String(字符串)

String 是 Redis 最基础的类型,一个 key 对应一个 value,最大支持 512MB。

2.1 基本命令

# 设置值
SET name "redis"
SET name "redis" EX 30        # 30秒过期
SET name "redis" PX 30000     # 30000毫秒过期
SET name "redis" NX           # 仅当key不存在时设置
SET name "redis" XX           # 仅当key存在时设置

# 获取值
GET name                       # "redis"

# 批量操作
MSET k1 "v1" k2 "v2" k3 "v3"
MGET k1 k2 k3                  # 1) "v1" 2) "v2" 3) "v3"

# 追加
APPEND name " tutorial"        # "redis tutorial"

# 长度
STRLEN name                    # 14

# 自增自减(值必须是数字)
SET counter 100
INCR counter                   # 101
INCRBY counter 10              # 111
DECR counter                   # 110
DECRBY counter 20              # 90

2.2 实战:页面访问计数器

# 每次访问页面自增
INCR page:home:views           # 1
INCR page:home:views           # 2
INCR page:home:views           # 3

# 获取今日访问量(按日期分key)
INCR page:home:views:20260724  # 1

# 设置过期时间,自动清理历史数据
EXPIRE page:home:views:20260724 86400

2.3 实战:分布式锁(简单版)

# 加锁:SET NX 保证原子性
SET lock:order:1001 "uuid-xxx" NX EX 30

# 释放锁(需要Lua脚本保证原子性)
# eval "if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:order:1001 uuid-xxx

三、Hash(哈希)

Hash 是一个键值对集合,特别适合存储对象。

3.1 基本命令

# 设置字段
HSET user:1001 name "张三"
HSET user:1001 age 25
HSET user:1001 email "zhangsan@example.com"

# 批量设置
HMSET user:1002 name "李四" age 30 email "lisi@example.com"

# 获取字段
HGET user:1001 name            # "张三"
HMGET user:1001 name age       # 1) "张三" 2) "25"

# 获取所有字段
HGETALL user:1001
# 1) "name"
# 2) "张三"
# 3) "age"
# 4) "25"
# 5) "email"
# 6) "zhangsan@example.com"

# 获取所有字段名/值
HKEYS user:1001                # name, age, email
HVALS user:1001                # 张三, 25, zhangsan@example.com

# 字段数量
HLEN user:1001                 # 3

# 删除字段
HDEL user:1001 email

# 字段自增
HINCRBY user:1001 age 1        # 26

3.2 实战:购物车

# 添加商品到购物车(user:1001 的购物车)
HSET cart:1001 product:2001 2    # 商品2001,数量2
HSET cart:1001 product:2002 1    # 商品2002,数量1

# 修改数量
HINCRBY cart:1001 product:2001 1  # 数量+1 → 3

# 查看购物车
HGETALL cart:1001

# 移除商品
HDEL cart:1001 product:2002

# 清空购物车
DEL cart:1001

四、List(列表)

List 是有序的字符串列表,支持在头部或尾部插入/弹出元素。

4.1 基本命令

# 左/右推入
LPUSH messages "msg1" "msg2"    # 列表: msg2, msg1
RPUSH messages "msg3"            # 列表: msg2, msg1, msg3

# 左/右弹出
LPOP messages                    # "msg2"
RPOP messages                    # "msg3"

# 查看范围
LRANGE messages 0 -1             # 所有元素
LRANGE messages 0 2              # 前3个

# 长度
LLEN messages

# 按索引获取
LINDEX messages 0                # 第一个元素

# 按索引设置
LSET messages 0 "new_msg"

# 阻塞弹出(消息队列核心命令)
BLPOP queue:task 30              # 阻塞最多30秒
BRPOP queue:task 30

4.2 实战:简单消息队列

# 生产者:推入任务
LPUSH queue:email '{"to":"a@b.com","subject":"Hello"}'

# 消费者:阻塞式弹出任务
BRPOP queue:email 0              # 0表示永久阻塞

# 优点:简单、原子性
# 缺点:无ACK机制,消息丢失需自行处理

五、Set(集合)

Set 是无序的、不重复的字符串集合。

5.1 基本命令

# 添加成员
SADD tags:article:1 "redis" "database" "cache"

# 查看所有成员
SMEMBERS tags:article:1          # redis, database, cache

# 是否是成员
SISMEMBER tags:article:1 "redis" # 1(true)

# 成员数量
SCARD tags:article:1             # 3

# 移除成员
SREM tags:article:1 "cache"

# 随机弹出
SPOP tags:article:1               # 随机移除并返回一个
SRANDMEMBER tags:article:1 2     # 随机返回2个(不移除)

5.2 集合运算

SADD set:a "1" "2" "3" "4"
SADD set:b "3" "4" "5" "6"

# 交集
SINTER set:a set:b               # 3, 4

# 并集
SUNION set:a set:b               # 1, 2, 3, 4, 5, 6

# 差集(a有但b没有)
SDIFF set:a set:b                # 1, 2

5.3 实战:共同关注

# 用户A关注了
SADD follows:user:A "redis" "mysql" "docker"

# 用户B关注了
SADD follows:user:B "redis" "nginx" "docker"

# 共同关注
SINTER follows:user:A follows:user:B    # redis, docker

# A关注但B没关注
SDIFF follows:user:A follows:user:B     # mysql

# 推荐关注(B关注但A没关注)
SDIFF follows:user:B follows:user:A     # nginx

六、ZSet(有序集合)

ZSet 每个成员关联一个分数(score),按分数排序,是 Redis 最强大的数据结构之一。

6.1 基本命令

# 添加成员(带分数)
ZADD ranking 100 "player1"
ZADD ranking 200 "player2"
ZADD ranking 150 "player3"
ZADD ranking 300 "player4"

# 按分数升序排名(0开始)
ZRANGE ranking 0 -1              # player1, player3, player2, player4
ZRANGE ranking 0 -1 WITHSCORES   # 带分数

# 按分数降序排名
ZREVRANGE ranking 0 -1           # player4, player2, player3, player1
ZREVRANGE ranking 0 -1 WITHSCORES

# 按分数范围查询
ZRANGEBYSCORE ranking 100 200     # 100~200分之间
ZRANGEBYSCORE ranking "(100" 200  # 不包含100

# 获取成员分数
ZSCORE ranking "player2"          # 200

# 获取成员排名
ZRANK ranking "player2"           # 2(升序第3名,0开始)
ZREVRANK ranking "player2"        # 1(降序第2名)

# 增加分数
ZINCRBY ranking 50 "player1"      # player1分数变为150

# 成员数量
ZCARD ranking                     # 4

# 分数范围内的成员数
ZCOUNT ranking 100 200            # 3

6.2 实战:游戏排行榜

# 玩家得分
ZADD game_rank 1500 "Alice"
ZADD game_rank 2300 "Bob"
ZADD game_rank 1800 "Charlie"
ZADD game_rank 2100 "David"
ZADD game_rank 1900 "Eve"

# Top 3
ZREVRANGE game_rank 0 2 WITHSCORES
# 1) "Bob" 2) "2300"
# 3) "David" 4) "2100"
# 5) "Eve" 6) "1900"

# 查看某玩家排名
ZREVRANK game_rank "Alice"        # 4(第5名)

# 玩家加分
ZINCRBY game_rank 100 "Alice"     # Alice: 1600

# 分数段统计
ZCOUNT game_rank 1500 2000        # 3人(Alice, Charlie, Eve)

6.3 实战:延迟队列

# 将任务加入延迟队列(score为执行时间戳)
ZADD delay_queue 1721800500 "task1"   # 5秒后执行
ZADD delay_queue 1721800600 "task2"   # 15秒后执行
ZADD delay_queue 1721800700 "task3"   # 25秒后执行

# 消费者轮询:取出已到期的任务
# 用 Lua 脚本保证原子性
# eval "local items = redis.call('ZRANGEBYSCORE', KEYS[1], 0, ARGV[1]) 
#        if #items > 0 then 
#          redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, ARGV[1]) 
#        end 
#        return items" 1 delay_queue <当前时间戳>

七、其他常用命令

7.1 Key 管理

# 查找key(生产环境慎用 KEYS,用 SCAN)
KEYS user:*                      # 所有以user:开头的key
SCAN 0 MATCH user:* COUNT 100    # 渐进式扫描

# 过期时间
EXPIRE name 30                   # 30秒后过期
EXPIREAT name 1721800000         # 在指定时间戳过期
TTL name                         # 查看剩余秒数(-1永久,-2已过期)
PERSIST name                     # 移除过期时间

# 类型判断
TYPE name                        # string
TYPE user:1001                   # hash

7.2 通用操作

# 删除
DEL name                         # 删除单个
DEL name1 name2                  # 删除多个

# 判断存在
EXISTS name                      # 1(存在)

# 重命名
RENAME name newname

总结

类型核心特点一句话记忆
String一对一万能缓存
Hash一对多对象存储
List有序可重复消息队列
Set无序不重复去重与运算
ZSet有序不重复排行榜

掌握这五大类型和核心命令,就能应对 90% 以上的 Redis 使用场景。后续文章将深入持久化、缓存策略和集群部署。

0

评论 (0)

取消
0:00