Redis 字符串 String
String 是 Redis 最基础也最常用的类型,value 可以是字符串、整数或二进制数据(如图片字节),单值最大 512MB。缓存、计数器、验证码都建立在它之上,务必先吃透。
写入与读取
SET 设置键值,GET 读取,同一 key 再次 SET 即覆盖:
SET name zhangsan
# 输出:OK
GET name
# 输出:"zhangsan"
SET name lisi # 覆盖旧值
GET name
# 输出:"lisi"
批量读写
MSET/MGET 一次操作多个键,减少网络往返:
MSET k1 v1 k2 v2 k3 v3
# 输出:OK
MGET k1 k2 k3
# 输出:1) "v1" 2) "v2" 3) "v3"
带条件与过期时间的 SET
SET 可带 NX/XX 与 EX 选项,一个命令完成「加锁」或「限时缓存」:
SET token abc123 NX EX 60
# 输出:OK # NX:键不存在才写入
SET token xyz NX EX 60
# 输出:(nil) # 键已存在,写入失败
SET k v EX 5 # 5 秒后自动过期
TTL k
# 输出:(integer) 5
SETNX 等价于 SET ... NX,SETEX 等价于 SET ... EX,均可按习惯选用。
计数器
INCR/DECR 原子自增自减,INCRBY/DECRBY 指定步长,适合阅读数、库存:
SET page:read:1001 0
INCR page:read:1001
# 输出:(integer) 1
INCRBY page:read:1001 10
# 输出:(integer) 11
DECR page:read:1001
# 输出:(integer) 10
多个客户端并发 INCR 不会互相覆盖,因为命令本身原子执行。
其他常用命令
| 命令 | 作用 | 示例输出 |
|---|---|---|
| APPEND | 追加内容,返回新长度 | (integer) 7 |
| STRLEN | 取字节长度 | (integer) 5 |
| GETRANGE | 截取子串 | "wor" |
| SETRANGE | 从偏移位置覆盖 | OK |
| GETSET | 取旧值并写新值 | "old" |
APPEND msg hello
# 输出:(integer) 5
APPEND msg world
# 输出:(integer) 10
STRLEN msg
# 输出:(integer) 10
GETRANGE msg 0 4
# 输出:"hello"
底层编码与易踩坑
String 内部按内容选择编码:纯数字用 int,短串用 embstr,超长才转 raw,多数场景无需关心。
踩坑要点:
- INCR 作用于非数字串会报错,如 INCR "abc" 返回错误;
- 中文字符占多个字节,STRLEN 按字节计,与字符数不同;
- 误把对象序列化成 JSON 整串存 String,改一个字段就要整串读写,若字段常变应改用 Hash(见第 7 章)。
小结
String 承担 Redis 最常用的几类需求:缓存值、原子计数器、带过期时间的令牌。SET/GET/MSET/INCR 加上 NX/EX 选项已覆盖日常大半场景,注意二进制安全与计数类型即可放心使用。