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或使用专门的文件存储服务。

📖 小节

📝 作业

  1. 基本操作: 使用SET存储你的名字、年龄、城市,然后用MGET一次性获取
  2. 过期练习: 设置一个带过期时间的键,用TTL查看剩余时间
  3. 分布式锁: 使用SET NX EX实现一个简单的分布式锁,尝试获取锁和释放锁
  4. 批量操作: 使用MSET批量设置10个键,然后用MGET获取其中5个

下一课

下一课我们将学习 Redis 字符串(下),学习数值操作和位操作。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏