Redis 社招面试题:一个字符串类型的值,能存储的最大容量是多少?

0 阅读5分钟



有一年我准备跳槽,社招面试。面试官看着我简历上的 “Redis 熟练”,笑了一下:

面试官:那我问个简单的,Redis 的 String 最多能存多大?

我心想,这题简单啊。

我:512MB。

面试官没说对,也没说错,只是继续追问了一句:

那你觉得,Redis 真的适合存 512MB 的字符串吗?

那一刻,我脑子里“嗡”了一声。就像你告诉别人:

“我的行李箱最大能装 30 公斤。”

对方点点头,然后问你一句:

“那你会不会往里塞一整块大理石?”

这道题的真正考点,从来不是数字。

先给结论:String 的最大容量到底是多少?

先把标准答案摆出来,避免你心里不踏实。

Redis 中,一个 String 类型的值,最大容量是:512MB(2^29 - 1 字节)

这不是拍脑袋来的,而是 Redis 官方在设计时写死的上限。我们先用一句话总结:

但你放心,面试绝不会止步于这一行表格

把 Redis String 当成“行李箱”

为了讲清楚,我们先把 Redis 的 String 拟人化

  • Redis = 一个仓库
  • Key = 行李箱标签
  • Value = 行李箱里装的东西

String 类型,就是 Redis 提供的 “万能行李箱”

  • 能装数字
  • 能装 JSON
  • 能装二进制
  • 能装图片
  • 能装序列化对象

那问题来了:这个行李箱,最大能装多少?

答案:512MB

512MB 是怎么来的?不是拍脑袋

很多人只背数字,却不知道 为什么是 512MB

1、从源码说起:sds(简单动态字符串)

Redis 的 String,本质并不是 C 语言的 char*,而是一个自己实现的数据结构:SDS(Simple Dynamic String)

我们来看一个简化版的结构:

重点来了:

  • len 和 alloc 都是 int
  • Redis 设计中,字符串最大不能超过 2^29 - 1 字节

为什么不是 2^31 - 1?

因为 Redis 需要在多个地方做安全检查、内存分配、扩容控制,最终选择了一个 性能和安全的折中值

2、为什么偏偏是 512MB?

我们换个角度理解。Redis 是:

  • 单线程模型
  • 内存数据库
  • 追求极致性能

如果允许一个 String 存 2GB、4GB:

  • 一次读取 = 卡死主线程
  • 一次复制 = 内存翻倍
  • 一次网络传输 = 客户端直接炸

所以 Redis 的设计哲学是:我可以让你存,但我不会鼓励你这么用。

代码实锤:真的能存 512MB 吗?

理论讲完了,咱们上代码。

1、简单 SET 示例

SET big:key "hello"

没问题。

2、模拟一个大字符串(示意)

在 Java 中你可以这样搞(示意代码,别真跑):

理论上可以成功。 但我要提醒你一句:你跑成功了,不代表你能活着上线。

真正的坑:不是“能不能存”,而是“值不值”

这道题真正想考你的,是这几个点:

1、内存放大问题(内存不是你看到的那么简单)

Redis String 的内存占用 ≠ 实际字符串大小。

512MB 的字符串,实际可能占用 550MB+ 内存。

2、网络 IO:一次 GET 就是灾难

GET big:key

这一条命令意味着:

  • Redis 主线程阻塞
  • 网络缓冲区暴涨
  • 客户端反序列化卡死
  • JVM 直接 Full GC

面试官问你一句:“如果一个请求拉 500MB,你的系统还能扛住吗?”

3、持久化:RDB / AOF 都很痛

一个大 Key,能拖垮整个 Redis 实例。

面试官真正想听的“加分答案”

如果你只说:“String 最大 512MB。”

及格

如果你补一句:“但不推荐存这么大,会有大 Key 问题。”

良好

如果你这样说:“理论上 512MB,但实际生产中一般控制在 KB~MB 级,超大数据会拆分、分片、或者放对象存储。”

优秀

什么才是正确姿势?

1、拆分存储(分段)

2、用 Hash 而不是 String

HSET user:1001 name "xiaomi" age 31 desc "..."

3、大对象交给 OSS / S3 / 文件系统

Redis 只存:

  • URL
  • ID
  • 元数据

常见面试追问 Q&A

Q1:String 和 Hash 最大容量一样吗?

Q2:Key 名字本身有大小限制吗?

有,Key 也是 String,最大 512MB。

当然,没人会这么干。

Q3:Redis 会限制大 Key 吗?

不会主动禁止,但会让你付出代价。

一张表带你快速记忆

故事收尾:回到那场面试

回到开头那场面试。我最后补了一句:

“512MB 是理论上限,但生产中我们严格限制 String 大小,超过阈值一定会拆分或者换存储方案。”

面试官点点头,说了一句:

“说明你踩过坑。”

那一刻我就知道,这题我过了。

END

Redis 从来不是不能存大数据,而是你要为“存得大”付出代价。

记住一句话,面试和实战都好用: “上限是给设计者的,规范是给工程师的。”

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发给那个还在背 512MB 的朋友。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!