追加与取长度
APPEND 在字符串值尾部追加内容,键不存在时相当于 SET 并返回追加后的总长度;STRLEN 返回值的字节数。两者都是 O(1) 语义的命令,但长度口径是字节而不是字符,中文按 UTF-8 通常占 3 字节,做分页或截断时按字符数思考就会算错。
基本信息
| 适用 | Redis 4.0 及以上(命令语义各版本一致) |
|---|---|
| APPEND 返回值 | 追加后的字符串字节长度 |
| STRLEN | 字节数而非字符数 |
| 限制 | 与所有字符串一样受单键 512MB 上限约束 |
示例与验证
示例与验证
SET log "line1\n" # 初始值,6 字节
APPEND log "line2\n" # 返回 12,追加后的总字节长度
GET log # "line1\nline2\n"
STRLEN log # 12
SET cn 中文
STRLEN cn # 6:每个汉字 3 字节
APPEND cn "-尾部" # 12:6 + 2 个汉字 6 字节
TYPE log # string:确认键类型,APPEND 只能作用于字符串返回值与长度读法
| 观察项 | 含义 | 常见误解 |
|---|---|---|
| APPEND 返回值 | 追加后的总字节长度 | 误当成本次追加的字节数 |
| STRLEN 结果 | 字节长度 | 误当成字符数,中文场景偏大 3 倍 |
| 键不存在时 APPEND | 等价于 SET 并返回长度 | 以为会报错或返回 0 |
| 非字符串类型 | 返回类型错误 | 对 Hash、List 调用 APPEND 会直接报错 |
| 内部编码 | 小字符串为 embstr,超过阈值转 raw | 与 STRLEN 无关,但影响内存占用 |
典型使用场景
- 简易日志缓冲:按行 APPEND 再由消费者读取后清空
- 拼包场景:把多个片段合成一个值再一次性取走
- 长度校验:用 STRLEN 检查上报内容是否符合上限
- 内存排查:结合 MEMORY USAGE 判断单键占用是否异常
- 数据修复:确认二进制内容写入后字节长度与预期一致
频繁 APPEND 会让字符串不断增长并触发重新分配与整值复制,日志类场景更适合用 List 或 Stream 承载,字符串只保留小的聚合结果。
用 APPEND 拼大对象(例如把报文拼接成几十 MB 的 JSON)会同时踩上单键上限、复制放大与过期删除时的阻塞三个问题,应改为拆分或放到对象存储。
相关的字节口径命令
- GETRANGE 按字节区间取值,与 STRLEN 同一口径,中文场景要注意边界落在字节上
- SETRANGE 按偏移覆盖,偏移超出当前长度时会自动补零字节
- 写完可再用 STRLEN 校验字节数是否符合协议约定,避免编码差异导致的偏差