一、前言: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
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
网硕互联帮助中心




评论前必须登录!
注册