Redis 字符串(上)
字符串是Redis最基本的数据类型,本课学习字符串的基本操作命令。
SET命令详解
SET命令用于设置键值对,是Redis最常用的命令。
基本用法
REDIS
SET mykey "Hello Redis"
OK
SET成功后返回 OK。
SET命令参数
SET命令支持多个可选参数,实现不同的设置策略:
REDIS
# EX:设置过期时间(秒)
SET session:token "user_data" EX 3600
# PX:设置过期时间(毫秒)
SET cache:key "value" PX 60000
# NX:仅当键不存在时设置
SET lock:resource "locked" NX
# XX:仅当键存在时设置
SET counter 100 XX
# 组合使用:设置带过期时间的锁
SET lock:order:123 "locked" NX EX 10
参数说明表
| 参数 | 说明 | 示例 |
|---|---|---|
| EX seconds | 设置过期时间(秒) | SET key value EX 60 |
| PX milliseconds | 设置过期时间(毫秒) | SET key value PX 60000 |
| EXAT timestamp | 设置过期时间戳(秒) | SET key value EXAT 1700000000 |
| PXAT timestamp | 设置过期时间戳(毫秒) | SET key value PXAT 1700000000000 |
| NX | 仅当键不存在时设置 | SET key value NX |
| XX | 仅当键存在时设置 | SET key value XX |
| GET | 返回旧值(Redis 6.2+) | SET key value GET |
| KEEPTTL | 保留原有的过期时间 | SET key value KEEPTTL |
💡 分布式锁实现:
SET lock:resource "value" NX EX 10 是实现分布式锁的经典方式,NX保证原子性,EX防止死锁。
示例:实现分布式锁
BASH
# 获取锁(仅当锁不存在时设置,10秒后自动释放)
SET lock:product:123 "order_process" NX EX 10
# 释放锁(删除键)
DEL lock:product:123
GET命令详解
GET命令用于获取键的值。
基本用法
REDIS
SET mykey "Hello Redis"
GET mykey
"Hello Redis"
键不存在的情况
REDIS
GET notexist
(nil)
键不存在时返回 (nil)。
GET命令变体
REDIS
# GETSET:获取旧值并设置新值
SET counter 100
GETSET counter 0
"100" # 返回旧值
GET counter
"0" # 已更新为新值
# GETRANGE:获取字符串的子串
SET message "Hello Redis World"
GETRANGE message 0 4
"Hello"
GETRANGE message 6 10
"Redis"
⚠️ 注意: GETRANGE的索引从0开始,包含结束位置。
GETRANGE key 0 4 获取第0到第4个字符(共5个字符)。
DEL删除键
DEL命令用于删除一个或多个键。
删除单个键
REDIS
SET temp "temporary"
DEL temp
(integer) 1 # 返回删除的键数量
删除多个键
REDIS
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"
DEL key1 key2 key3
(integer) 3 # 删除了3个键
删除不存在的键
REDIS
DEL notexist
(integer) 0 # 删除了0个键
💡 返回值: DEL返回实际删除的键数量,不是被删除的值。
MSET和MGET批量操作
MSET和MGET可以一次性设置或获取多个键值对,减少网络往返次数。
MSET批量设置
REDIS
MSET user:1:name "Alice" user:1:age "25" user:1:city "Beijing"
OK
# 等价于
SET user:1:name "Alice"
SET user:1:age "25"
SET user:1:city "Beijing"
MGET批量获取
REDIS
MGET user:1:name user:1:age user:1:city
1) "Alice"
2) "25"
3) "Beijing"
# 包含不存在的键
MGET user:1:name user:1:email user:1:age
1) "Alice"
2) (nil) # 键不存在
3) "25"
MSETNX:仅当所有键都不存在时设置
REDIS
# 所有键都不存在时才设置
MSETNX key1 "value1" key2 "value2"
(integer) 1 # 设置成功
# 再次尝试(key1和key2已存在)
MSETNX key1 "new1" key3 "value3"
(integer) 0 # 设置失败,key1已存在
# 验证:key3未被设置
GET key3
(nil)
⚠️ 注意: MSETNX是原子操作,要么全部成功,要么全部失败。
STRLEN获取长度
STRLEN返回字符串值的长度(字节数)。
基本用法
REDIS
SET mykey "Hello Redis"
STRLEN mykey
(integer) 11
SET chinese "你好"
STRLEN chinese
(integer) 6 # 中文UTF-8编码,每个汉字3字节
键不存在的情况
REDIS
STRLEN notexist
(integer) 0
APPEND追加字符串
APPEND命令用于向字符串末尾追加内容。
基本用法
REDIS
SET mykey "Hello"
APPEND mykey " Redis"
(integer) 11 # 返回追加后的总长度
GET mykey
"Hello Redis"
追加到不存在的键
REDIS
APPEND newkey "value"
(integer) 5 # 相当于SET newkey "value"
GET newkey
"value"
💡 用途: APPEND可用于构建日志、拼接URL等场景。
字符串应用场景
场景1:缓存
REDIS
# 缓存API响应
SET cache:api:user:1 '{"name":"Alice","age":25}' EX 300
# 获取缓存
GET cache:api:user:1
场景2:会话存储
REDIS
# 存储用户会话(30分钟过期)
SET session:token:abc123 '{"user_id":1,"role":"admin"}' EX 1800
# 验证会话
GET session:token:abc123
场景3:分布式锁
REDIS
# 获取锁(10秒自动释放)
SET lock:order:process "server1" NX EX 10
# 如果返回OK,表示获取锁成功
# 如果返回nil,表示锁已被占用
# 释放锁
DEL lock:order:process
场景4:验证码
REDIS
# 存储验证码(5分钟过期)
SET code:phone:13800138000 "123456" EX 300
# 验证
GET code:phone:13800138000
场景5:限流
REDIS
# 记录API访问次数(1分钟窗口)
SET limit:api:user:1 "0" EX 60
# 每次访问时自增(需要配合INCR命令)
字符串编码优化
Redis会根据字符串内容自动选择最优编码:
| 编码类型 | 使用条件 | 说明 |
|---|---|---|
| int | 整数值且在long范围内 | 整数编码,节省内存 |
| embstr | 字符串长度 ≤ 44字节 | 嵌入式字符串,紧凑存储 |
| raw | 字符串长度 > 44字节 | 普通字符串,使用SDS |
查看编码类型
REDIS
SET intkey 12345
OBJECT ENCODING intkey
"int"
SET shortkey "Hello"
OBJECT ENCODING shortkey
"embstr"
SET longkey "This is a very long string that exceeds 44 bytes limit"
OBJECT ENCODING longkey
"raw"
ℹ️ 了解: 编码类型由Redis自动选择,无需手动干预。了解编码有助于优化内存使用。
❓ 常见问题
Q SET命令会覆盖已存在的键吗?
A 会。默认情况下SET会覆盖已存在的键。使用NX参数可以仅在键不存在时设置。
Q 如何实现"仅当键存在时才更新"?
A 使用SET命令的XX参数:
SET key value XX。仅当键存在时才设置新值。Q MSET和多次SET有什么区别?
A MSET是原子操作,一次网络往返完成多次设置,效率更高。多次SET需要多次网络往返。
Q 字符串最大能存储多少数据?
A 最大512MB。但建议不要存储过大的字符串,会影响性能和内存。
Q 如何存储二进制数据(如图片)?
A Redis字符串是二进制安全的,可以直接存储。但建议存储图片的URL或使用专门的文件存储服务。
📖 小节
- SET设置键值,支持EX/PX/NX/XX等参数
- GET获取键值,键不存在返回nil
- DEL删除键,返回实际删除的数量
- MSET/MGET批量操作,减少网络往返
- STRLEN获取字符串长度,APPEND追加字符串
- 字符串常用于缓存、会话、分布式锁、验证码等场景
- Redis自动选择最优编码(int/embstr/raw)
📝 作业
- 基本操作: 使用SET存储你的名字、年龄、城市,然后用MGET一次性获取
- 过期练习: 设置一个带过期时间的键,用TTL查看剩余时间
- 分布式锁: 使用SET NX EX实现一个简单的分布式锁,尝试获取锁和释放锁
- 批量操作: 使用MSET批量设置10个键,然后用MGET获取其中5个
下一课
下一课我们将学习 Redis 字符串(下),学习数值操作和位操作。



