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 选项已覆盖日常大半场景,注意二进制安全与计数类型即可放心使用。

笔记加载中…