String
命令
基本操作
命令 |
作用 |
示例 |
SET key value |
设置键 key 的值为 value |
SET name "Alice" |
GET key |
获取键 key 的值 |
GET name → "Alice" |
DEL key |
删除键 key |
DEL name |
EXISTS key |
判断 key 是否存在 |
EXISTS name → 1 (存在) |
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 |
追加 value 到 key 的末尾 |
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(登录令牌)并设置过期时间。 练习:
- 创建一个用户登录 Session,值为
"user_12345_logged_in"
,并设置 30 分钟过期
- 查询该 Session 是否存在
- 模拟用户访问系统,重置 Session 的过期时间为 30 分钟
- 让 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 永不过期
|
复制代码
商品仓库管理
需求:
你在实现一个电商系统,需要管理商品库存,每次用户购买时,库存减少。
练习:
- 创建一个商品库存(商品 ID 为 1001),库存数量为
50
- 用户购买 3 件商品,更新库存
- 查询当前库存量
- 商品卖完后,删除库存记录
1 2 3 4
| SET stock:1001 50 # 1. 设置商品库存 DECRBY stock:1001 3 # 2. 用户购买 3 件,库存减少 GET stock:1001 # 3. 查询当前库存 DEL stock:1001 # 4. 删除库存记录(商品卖完)
|
复制代码
计数器(网站访问统计)
需求: 你在开发一个博客网站,需要统计文章的浏览量。
练习:
- 文章 ID 为
2001
,初始化浏览次数为 0
- 模拟用户访问文章 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 次,超出则禁止访问。
练习:
- 用户 ID 为
789
,请求 API,记录访问次数。
- 检查用户的请求次数,若超过
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 |
增加 member 的 score |
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 |
获取 member 的 score |
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 时
复制代码