云计算百科
云计算领域专业知识百科平台

Redis命令-String命令

一、前言:String 是 Redis 的“基石”

在 Redis 的五大数据类型中,String(字符串)是最基础、最常用的一种。
它不仅是简单的文本存储工具,还支持数字自增、二进制数据、原子操作等高级特性。

📌 事实:超过 80% 的 Redis 使用场景都基于 String 类型!

本文将带你:
✅ 全面掌握 String 类型的核心命令
✅ 理解命令的原子性与性能特点
✅ 结合真实业务场景(缓存、计数器、分布式锁)
✅ 避开常见使用误区


二、String 类型基本特性

  • Value 可以是:字符串、整数、浮点数、甚至二进制数据(如图片、序列化对象)
  • 最大容量:512 MB(单个 Value)
  • 底层编码:int(小整数)、embstr(短字符串)、raw(长字符串)
  • 所有操作都是原子的:天然线程安全

三、核心命令详解(附示例)

1. SET key value [EX seconds] [PX milliseconds] [NX|XX]

设置 Key 的值,支持多种选项。

# 基础用法
SET username "alice"

# 设置并指定过期时间(秒)
SET token "abc123" EX 3600

# 设置并指定过期时间(毫秒)
SET temp_data "hello" PX 5000

# 仅当 key 不存在时才设置(实现分布式锁的关键!)
SET mylock "owner1" NX EX 30

# 仅当 key 存在时才更新
SET config "v2" XX

✅ NX + EX 组合是实现分布式锁的标准方式。


2. GET key

获取 Key 的值。

GET username
# 返回 "alice"

GET non_existent_key
# 返回 (nil)

💡 注意:对非 String 类型的 Key 执行 GET 会返回错误。


3. MSET / MGET —— 批量操作

减少网络往返,提升性能。

# 一次设置多个 Key
MSET name "bob" age "25" city "Shanghai"

# 一次获取多个 Key
MGET name age city
# 返回 1) "bob" 2) "25" 3) "Shanghai"

⚡ 性能优势:1 次 MGET 比 3 次 GET 快 2~3 倍(尤其在高延迟网络下)。


4. INCR / DECR —— 原子自增/自减

对数值型 String 进行原子加减(即使初始值不存在,也从 0 开始)。

# 初始化并自增
INCR page_view:home
# 返回 1

# 再次执行
INCR page_view:home
# 返回 2

# 自减
DECR stock:iphone
# 返回 -1(如果初始为 0)

# 指定步长
INCRBY counter 10 # +10
DECRBY balance 50 # -50

🔒 关键特性:这些操作是原子的,无需担心并发问题!


5. SETEX / SETNX —— 专用命令(已逐步被 SET 替代)

  • SETEX key seconds value = SET key value EX seconds
  • SETNX key value = SET key value NX

📌 官方建议:优先使用带选项的 SET 命令,语义更清晰,功能更全。


6. APPEND key value —— 字符串追加

SET log "start"
APPEND log " -> step1"
APPEND log " -> step2"
GET log
# 返回 "start -> step1 -> step2"

⚠️ 注意:频繁 APPEND 大字符串可能导致内存碎片,慎用。


7. STRLEN key —— 获取字符串长度

SET message "Hello Redis"
STRLEN message
# 返回 11

✅ 时间复杂度 O(1),因为 Redis 在内部已记录长度。


四、String 类型的典型应用场景

场景 1:缓存简单对象

# 伪代码:缓存用户信息
user_json = json.dumps({"id": 1001, "name": "张三"})
redis.setex("user:1001", 3600, user_json)

# 读取
data = redis.get("user:1001")

✅ 优势:简单、高效
❌ 局限:更新需全量覆盖(考虑改用 Hash)


场景 2:分布式计数器

# 接口限流:每秒最多 100 次
INCR rate_limit:/api/v1/user
EXPIRE rate_limit:/api/v1/user 1 # 1秒后自动重置

⚡ 实现滑动窗口限流的基础。


场景 3:分布式锁

# 加锁(30秒自动释放)
SET lock:order_create "instance_01" 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_create instance_01

🔐 关键:锁值 = 唯一标识(如实例ID),防止误删他人锁。


场景 4:存储二进制数据

  • 存储序列化的 Protobuf / Java 对象
  • 缓存图片 Base64(不推荐大图,可用 URL 代替)

SET avatar:1001 "<base64_data>"


五、常见误区与最佳实践

❌ 误区 1:用 String 存大 JSON 并频繁更新

问题:每次更新需反序列化 → 修改 → 序列化 → 全量写回
建议:改用 Hash,字段级更新更高效

❌ 误区 2:忘记设置 TTL

后果:缓存永不过期,内存持续增长 → OOM
建议:所有缓存必须设过期时间(EX / PX)

❌ 误区 3:用 INCR 存浮点数

事实:INCR 仅支持整数!浮点数请用 INCRBYFLOAT

INCRBYFLOAT price 0.99

✅ 最佳实践:

  • Key 命名规范:业务:实体:id(如 cache:user:1001)
  • 优先使用 SET 带选项,替代 SETEX / SETNX
  • 大 Value 拆分:单个 Value 不超过 10KB
  • 批量操作用 MSET/MGET

六、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

赞(0)
未经允许不得转载:网硕互联帮助中心 » Redis命令-String命令
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!