String 的大小上限
单个 String 最大 512MB,这是所有数据类型共享的单值上限。String 是二进制安全的,可以存放序列化的对象、图片或压缩包,但大 value 会同时放大复制流量、持久化时间与过期删除的阻塞程度,因此实际使用中应当把 value 控制在 KB 级。
基本信息
| 适用 | Redis 全版本,String 类型 |
|---|---|
| 上限 | 单键 512MB,所有数据类型共享该限制 |
| 二进制安全 | 可以包含空字符与任意字节 |
| 建议 | value 控制在 KB 级,多数场景小于 100KB |
容量自查
容量自查
SET bigdata "..." # 接近上限会报错:string exceeds maximum allowed size
STRLEN bigdata # 字节长度
MEMORY USAGE bigdata # 单键实际内存占用(字节)
GETRANGE bigdata 0 99 # 只取前 100 字节,避免整值拉取
OBJECT ENCODING bigdata # 小值为 embstr,大值转 raw
redis-cli --bigkeys # 采样扫描,定位实例中的大 key长度与内存口径
| 指标 | 口径 | 注意 |
|---|---|---|
| STRLEN | 值的字节长度 | 不是字符数,中文按 UTF-8 占 3 字节 |
| MEMORY USAGE | 键的完整内存占用 | 包含结构开销,比 STRLEN 更贴近实际 |
| 512MB | 单值上限 | 达到上限时写入直接报错 |
| OBJECT ENCODING | 内部编码 | embstr 与 raw 影响内存与复制效率 |
| 大 key 采样 | redis-cli --bigkeys | 采样有开销,建议低峰或从库执行 |
典型使用场景
- 缓存序列化对象:value 应控制在合理大小
- 会话数据存储:注意单键体积随会话内容膨胀
- 计数器与标志位:小值场景,内存开销可忽略
- 大文件或图片:改用对象存储并把 URL 放进 Redis
- 排查大 key:用 MEMORY USAGE 逐键确认并拆分
大 value 是 Redis 的典型反模式:删除与过期时释放缓慢、主从复制出现网络抖动、RDB 快照写入变慢,通常应改为拆片或放到对象存储。
单值上限对集合类同样适用:List、Hash、Set 的单个元素或字段值也受该上限约束,超限时同样直接报错。
大 key 治理动作
- 定期用采样命令统计大 key,形成台账而不是临时排查
- 按业务主键或时间维度拆分,把单键体积压回合理区间
- 非结构化的大内容改用对象存储,Redis 只保留索引与访问地址
- 治理前后都用 MEMORY USAGE 对比,确认体积确实下降