Redis常用命令和应用场景

String

命令

基本操作

命令 作用 示例
SET key value 设置键 key 的值为 value SET name "Alice"
GET key 获取键 key 的值 GET name"Alice"
DEL key 删除键 key DEL name
EXISTS key 判断 key 是否存在 EXISTS name1(存在)
EXPIRE key seconds 设定 key 的过期时间 EXPIRE name 10(10秒后自动删除)

过期和获取 TTL

命令 作用 示例
TTL key 获取 key 剩余的过期时间(秒) TTL name
PERSIST key 移除 key 的过期时间 PERSIST name

自增/自减(用于计数)

命令 作用 示例
INCR key key 的值自增 1 INCR counter
INCRBY key increment key 的值增加 increment INCRBY counter 10
DECR key key 的值自减 1 DECR counter
DECRBY key decrement key 的值减少 decrement DECRBY counter 5

批量操作

命令 作用 示例
MSET key1 value1 key2 value2 ... 一次设置多个键值对 MSET k1 v1 k2 v2
MGET key1 key2 ... 获取多个键的值 MGET k1 k2
MSETNX key1 value1 key2 value2 ... 仅当所有 key 不存在时设置 MSETNX k3 v3 k4 v4

追加和修改

命令 作用 示例
APPEND key value 追加 valuekey 的末尾 APPEND name " Bob"
SETEX key seconds value 设置 key 并指定秒级过期时间 SETEX session 60 "data"
SETNX key value 仅当 key 不存在时设置值 SETNX lock "locked"
SETRANGE key offset value offset 位置起修改字符串 SETRANGE mykey 6 "Redis"
GETRANGE key start end 获取子字符串(类似 substr GETRANGE name 0 4

应用场景

用户登录管理场景

需求: 你正在实现一个用户管理系统,需要存储用户的 Session(登录令牌)并设置过期时间。 练习:

  1. 创建一个用户登录 Session,值为 "user_12345_logged_in",并设置 30 分钟过期
  2. 查询该 Session 是否存在
  3. 模拟用户访问系统,重置 Session 的过期时间为 30 分钟
  4. 让 Session 永不过期
1
2
3
4
SET user:session "user_12345_logged_in" EX 1800  # 1. 设置 session 30 分钟过期
EXISTS user:session # 2. 检查 session 是否存在
EXPIRE user:session 1800 # 3. 重新设置过期时间
PERSIST user:session # 4. 让 session 永不过期
复制代码

商品仓库管理

需求: 你在实现一个电商系统,需要管理商品库存,每次用户购买时,库存减少。 练习:

  1. 创建一个商品库存(商品 ID 为 1001),库存数量为 50
  2. 用户购买 3 件商品,更新库存
  3. 查询当前库存量
  4. 商品卖完后,删除库存记录
1
2
3
4
SET stock:1001 50    # 1. 设置商品库存
DECRBY stock:1001 3 # 2. 用户购买 3 件,库存减少
GET stock:1001 # 3. 查询当前库存
DEL stock:1001 # 4. 删除库存记录(商品卖完)
复制代码

计数器(网站访问统计)

需求: 你在开发一个博客网站,需要统计文章的浏览量。 练习:

  1. 文章 ID 为 2001,初始化浏览次数为 0
  2. 模拟用户访问文章 3 次
  3. 查询当前的浏览次数
1
2
3
4
5
SET views:2001 0   # 1. 初始化文章浏览量
INCR views:2001 # 2. 文章被访问 1 次
INCR views:2001 # 2.1 文章被访问 1 次
INCR views:2001 # 2.2 文章被访问 1 次
GET views:2001 # 3. 查询当前浏览次数
复制代码

限流(防止用户频繁操作)

需求: 你在开发一个 API,限制用户 1 分钟内最多请求 3 次,超出则禁止访问。 练习:

  1. 用户 ID 为 789,请求 API,记录访问次数。
  2. 检查用户的请求次数,若超过 3 次,则拒绝访问。
  3. 设置该计数器 60 秒后自动过期。
1
2
3
INCR user:limit:789   		# 1. 记录用户请求次数
GET user:limit:789 # 2. 检查访问次数是否超过 3 次
EXPIRE user:limit:789 60 # 3. 设置 60 秒过期
复制代码

List(支持下标操作)

命令

添加与删除元素

命令 作用 示例
LPUSH key value [value ...] 从左侧插入一个或多个元素 LPUSH mylist "a" "b" "c"
RPUSH key value [value ...] 从右侧插入一个或多个元素 RPUSH mylist "x" "y" "z"
LPOP key 从左侧弹出一个元素 LPOP mylist"c"
RPOP key 从右侧弹出一个元素 RPOP mylist"z"
LPUSHX key value 仅当 key 存在 时,从左侧插入一个元素 LPUSHX mylist "new"
RPUSHX key value 仅当 key 存在 时,从右侧插入一个元素 RPUSHX mylist "end"

获取列表元素

命令 作用 示例
LRANGE key start stop 获取列表指定范围的元素(索引从 0 开始,-1 表示最后一个元素) LRANGE mylist 0 -1
LLEN key 获取列表长度 LLEN mylist
LINDEX key index 获取索引 index 处的元素 LINDEX mylist 2
LSET key index value 修改索引 index 处的值 LSET mylist 1 "new_value"

删除和修剪列表

命令 作用 示例
LREM key count value 删除 count 个值为 value 的元素 LREM mylist 2 "a"
LTRIM key start stop 保留指定范围内的元素,其余删除 LTRIM mylist 1 -1
DEL key 删除整个列表 DEL mylist

阻塞操作(适用于消息队列)

命令 作用 示例
BLPOP key [key ...] timeout 阻塞,直到从左侧弹出元素或超时 BLPOP mylist 5
BRPOP key [key ...] timeout 阻塞,直到从右侧弹出元素或超时 BRPOP mylist 5
BRPOPLPUSH source destination timeout 阻塞,从 source 右侧弹出并推入 destination 左侧 BRPOPLPUSH mylist backup 5

其他操作

命令 作用 示例
RPOPLPUSH source destination 非阻塞,从 source 右侧弹出并推入 destination 左侧 RPOPLPUSH mylist backup
EXPIRE key seconds 设置 key 过期时间 EXPIRE mylist 60
TTL key 查询 key 还有多少秒过期 TTL mylist

应用场景

任务队列(生产者-消费者模型)

场景: 假设你有一个消息队列,生产者不断向队列中添加任务,消费者从队列中获取任务处理。

1
2
3
4
5
6
7
8
9
10
11
12
# 生产者:添加任务到任务队列(队列名:task_queue)
LPUSH task_queue "任务1" "任务2" "任务3"

# 查看当前任务队列
LRANGE task_queue 0 -1

# 消费者:从队列中获取任务并处理
RPOP task_queue
RPOP task_queue

# 再次查看队列剩余任务
LRANGE task_queue 0 -1
复制代码

实现点赞排行榜

场景: 记录帖子点赞情况,最新的点赞用户排在最前面(前插入),展示最近 5 个点赞用户(只保留前五个数据)。

1
2
3
4
5
6
7
8
9
10
11
12
# 用户点赞
LPUSH like_list "用户A"
LPUSH like_list "用户B"
LPUSH like_list "用户C"
LPUSH like_list "用户D"
LPUSH like_list "用户E"

# 只保留最近 5 个点赞用户
LTRIM like_list 0 4

# 展示最近点赞的 5 个用户
LRANGE like_list 0 -1
复制代码

Set

命令

添加与删除元素

命令 作用 示例
SADD key member [member ...] 向集合 key 添加一个或多个元素 SADD myset "apple" "banana"
SREM key member [member ...] 移除集合 key 中的一个或多个元素 SREM myset "apple"
SPOP key [count] 随机移除并返回 count 个元素 SPOP myset 2
SRANDMEMBER key [count] 随机获取 count 个元素(不删除) SRANDMEMBER myset 2

查询集合元素

命令 作用 示例
SMEMBERS key 获取集合中所有元素 SMEMBERS myset
SCARD key 获取集合的元素数量 SCARD myset
SISMEMBER key member 判断元素 member 是否在集合中 SISMEMBER myset "banana"
SMOVE source destination member 将元素从 source 移动到 destination SMOVE myset newset "banana"

集合运算(交集、并集、差集)

命令 作用 示例
SINTER key1 key2 ... 求多个集合的交集 SINTER set1 set2
SINTERSTORE destination key1 key2 ... 计算交集并存储到 destination SINTERSTORE result set1 set2
SUNION key1 key2 ... 求多个集合的并集 SUNION set1 set2
SUNIONSTORE destination key1 key2 ... 计算并集并存储到 destination SUNIONSTORE result set1 set2
SDIFF key1 key2 ... key1 相对于 key2 的差集 SDIFF set1 set2
SDIFFSTORE destination key1 key2 ... 计算差集并存储到 destination SDIFFSTORE result set1 set2

其他操作

命令 作用 示例
DEL key 删除整个集合 DEL myset
EXPIRE key seconds 设置集合的过期时间 EXPIRE myset 60
TTL key 查看集合的剩余存活时间 TTL myset

应用场景

用户兴趣标签管理

假设你正在为一个社交媒体平台开发功能,用户可以选择自己感兴趣的标签。使用 Redis 的 Set 来管理每个用户的兴趣标签,避免重复标签。

  • 添加标签SADD user:123:interests "sports" "technology" "music"
  • 获取标签SMEMBERS user:123:interests
  • 移除标签SREM user:123:interests "music"
  • 检查是否有某标签SISMEMBER user:123:interests "technology"

共同兴趣标签查询

你可以使用 Redis Set 来查询两个用户之间的共同兴趣标签。

  • 用户A的兴趣标签SADD user:1:interests "sports" "music" "technology"
  • 用户B的兴趣标签SADD user:2:interests "sports" "cooking" "music"
  • 获取共同标签SINTER user:1:interests user:2:interests

网站访问记录

假设你需要记录每个用户访问的网站,每个用户的访问记录可以使用 Redis Set 来存储,避免重复的访问记录。

  • 添加访问记录SADD user:123:visited "siteA.com" "siteB.com" "siteC.com"
  • 判断是否访问过某个网站SISMEMBER user:123:visited "siteB.com"

集合的联合操作

使用 Redis Set,你可以实现多个集合的并集操作,例如获取两个用户关注的标签的所有标签(不重复)。

  • 用户A的兴趣标签SADD user:1:interests "sports" "music" "technology"
  • 用户B的兴趣标签SADD user:2:interests "sports" "cooking"
  • 获取所有标签SUNION user:1:interests user:2:interests

Hash(支持 value 为多个字段)

命令

添加与修改字段

命令 作用 示例
HSET key field value 设置 field 对应的值,如果 field 存在则覆盖 HSET user:1 name "Alice"
HSET key field1 value1 field2 value2 ... 一次性设置多个字段 HSET user:1 age 25 city "Shanghai"
HSETNX key field value 仅当 field 不存在 时才设置 HSETNX user:1 country "China"

获取字段值

命令 作用 示例
HGET key field 获取 field 对应的值 HGET user:1 name
HMGET key field1 field2 ... 获取多个字段的值 HMGET user:1 name age
HGETALL key 获取所有字段及其值(类似 dict HGETALL user:1

删除字段

命令 作用 示例
HDEL key field [field ...] 删除指定 field HDEL user:1 age

统计字段

命令 作用 示例
HLEN key 获取 key 中字段的数量 HLEN user:1
HEXISTS key field 判断 field 是否存在 HEXISTS user:1 name

遍历与获取所有字段

命令 作用 示例
HKEYS key 获取所有字段(keys) HKEYS user:1
HVALS key 获取所有值(values) HVALS user:1

数值操作

命令 作用 示例
HINCRBY key field increment field 的值增加 increment HINCRBY user:1 age 1
HINCRBYFLOAT key field increment 以浮点数方式递增 HINCRBYFLOAT user:1 balance 10.5

其他操作

命令 作用 示例
DEL key 删除整个 hash DEL user:1
EXPIRE key seconds 设置 hash 过期时间 EXPIRE user:1 3600

应用场景

商品库存管理

需求:你正在开发一个电商系统,需要存储商品的名称、库存、价格,并能更新库存和价格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 添加商品信息
HSET product:2001 name "Laptop" stock 50 price 4999.99

# 查询商品所有信息
HGETALL product:2001

# 查询库存
HGET product:2001 stock

# 增加库存(进货)
HINCRBY product:2001 stock 10

# 减少库存(销售)
HINCRBY product:2001 stock -5

# 更新价格
HSET product:2001 price 4799.99
复制代码

Zset(有序且支持范围操作)

命令

添加与修改元素

命令 作用 示例
ZADD key score member 添加元素 member,并设置 score ZADD leaderboard 100 "Alice"
ZADD key score1 member1 score2 member2 ... 一次性添加多个元素 ZADD leaderboard 95 "Bob" 110 "Charlie"
ZINCRBY key increment member 增加 memberscore ZINCRBY leaderboard 10 "Alice"

获取元素

命令 作用 示例
ZRANGE key start stop [WITHSCORES] score 升序 获取元素(索引从 0 开始) ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE key start stop [WITHSCORES] score 降序 获取元素 ZREVRANGE leaderboard 0 2 WITHSCORES
ZRANK key member 获取 member 在有序集合中的排名(升序) ZRANK leaderboard "Alice"
ZREVRANK key member 获取 member 在有序集合中的排名(降序) ZREVRANK leaderboard "Alice"
ZSCORE key member 获取 memberscore ZSCORE leaderboard "Alice"
ZCARD key 获取有序集合的元素数量 ZCARD leaderboard

score 进行范围查询

命令 作用 示例
ZRANGEBYSCORE key min max [WITHSCORES] score 范围(升序)获取元素 ZRANGEBYSCORE leaderboard 90 110 WITHSCORES
ZREVRANGEBYSCORE key max min [WITHSCORES] score 范围(降序)获取元素 ZREVRANGEBYSCORE leaderboard 110 90 WITHSCORES
ZCOUNT key min max 统计 score[min, max] 范围内的元素数量 ZCOUNT leaderboard 90 110

删除元素

命令 作用 示例
ZREM key member 删除 member ZREM leaderboard "Bob"
ZREMRANGEBYRANK key start stop 删除排名在 [start, stop] 范围内的元素 ZREMRANGEBYRANK leaderboard 0 2
ZREMRANGEBYSCORE key min max 删除 score[min, max] 范围内的元素 ZREMRANGEBYSCORE leaderboard 80 90

其他操作

命令 作用 示例
DEL key 删除整个有序集合 DEL leaderboard
EXPIRE key seconds 设置 ZSet 过期时间 EXPIRE leaderboard 3600

应用场景

商品价格排序

背景:一个电商平台需要对商品按照价格进行排序。 目标:使用 ZADD 存储价格,ZRANGEBYSCORE 获取某价格区间商品。

1
2
3
4
5
# 添加商品价格
ZADD product_prices 99.99 product_1 199.99 product_2 49.99 product_3

# 获取价格区间 50-150 的商品
ZRANGEBYSCORE product_prices 50 150 WITHSCORES
复制代码

文章点赞排行榜

背景:开发一个文章系统,用户可以点赞文章,需要维护点赞数排行榜。 目标:使用 ZINCRBY 更新点赞数,ZRANGE 获取排行榜。

1
2
3
4
5
6
7
8
# 给文章 101、102、103 赋初始点赞数
ZADD article_likes 10 101 5 102 8 103

# 用户点赞文章 101
ZINCRBY article_likes 1 101

# 获取点赞排行榜(按点赞数降序)
ZRANGE article_likes 0 -1 WITHSCORES REV
复制代码

运动打卡排行榜

背景:健身 APP 需要记录用户本月跑步的总公里数,展示排行榜。 目标:使用 ZINCRBY 记录公里数,ZREVRANGE 排行。

1
2
3
4
5
6
7
8
# 记录跑步公里数
ZADD running_rank 42 user_X 30 user_Y 50 user_Z

# 用户 Y 跑步 10 公里
ZINCRBY running_rank 10 user_Y

# 获取跑步排行榜
ZREVRANGE running_rank 0 -1 WITHSCORES
复制代码

数据结构的选择策略

String(字符串)

适用场景:

  • 适合作为缓存,存储单个键值对(如用户信息、配置项)。
  • 计数器(INCR / DECR 操作)。
  • 分布式锁(SETNX + EX)。
  • 存储 JSON、序列化对象(但需要应用端解析)。

选择策略:

  • 适用于简单的键值存储,避免存储超大字符串(建议 <512MB)。
  • 使用 SETEX 实现带过期时间的缓存。

List(列表)

适用场景:

  • 消息队列LPUSH + BRPOP)。
  • 任务队列(如生产者/消费者模型)。
  • 时间序列数据(有序插入的数据)。

选择策略:

  • 需要严格顺序的场景选择 List
  • 避免列表过长(如 LPUSH 操作的列表),影响 LRANGE 查询性能。

Set(集合)

适用场景:

  • 需要去重存储的数据(如不重复的用户 ID、标签)。
  • 社交网络(如共同关注 SINTER,关注列表 SADD)。
  • 随机推荐(SRANDMEMBER)。

选择策略:

  • 适用于无序、唯一性的数据。
  • 需要做交集、并集、差集运算时更适合 Set

Sorted Set(有序集合)

适用场景:

  • 排行榜(按分数排序,如用户积分榜)。
  • 延时任务(如定时消息推送 ZADD + ZRANGEBYSCORE)。
  • 最近访问记录(最新的 N 条数据)。

选择策略:

  • 适用于需要排序的数据,避免大规模删除影响性能。
  • ZREMRANGEBYRANK 用于定期清理数据,避免集合过大。

Hash(哈希表)

适用场景:

  • 对象存储(如用户信息 HSET user:1 name "张三")。
  • 减少键的数量(多个字段归属于一个键)。

选择策略:

  • 适用于存储结构化数据,比 String 适合存储多个字段。
  • 如果字段少,使用 String 可能更合适(避免额外的内存开销)。

命名策略

  • 避免过长的 Key(推荐 10~50 字符):短小精悍,避免占用太多内存
  • 避免使用空格:Redis 的 Key 不能包含空格
  • 使用统一的分隔符(建议使用 :):有层次结构,便于查询和管理
  • 使用可读的单词:避免随机字符,确保可读性
  • 尽量避免特殊字符:如 \n, \r, \t,可能导致命令解析错误
  • 保证 Key 的唯一性:避免 Key 冲突,尤其是在多个应用共享 Redis 时
1
命名空间:模块:对象:id
复制代码