面试里常会问到redis sds的最大长度是多少,通常统一的回答是512M,但这个512M是拿来的?
当客户端操作 client 时,一般不会直接使用 sds ,而是通过对象的方式来使用。比如创建的字符串其实是一个对象,间接使用到了 sds 结构。限制 512M 的逻辑在 t_string.c 的 checkStringLength 方法。
在redis3.2.13、redis4.0.14、redis5.0.9版本里面的的一个方法,checkStringLength
里面写死了限制512*1024*1024
,这个方法常在 SET/HSET
的时候被调用。
static int checkStringLength(client *c, long long size) {
if (size > 512*1024*1024) {
addReplyError(c,"string exceeds maximum allowed size (512MB)");
return C_ERR;
}
return C_OK;
}
而在redis6.2.7版本里面,这个长度已经改为读取配置 proto-max-bulk-len
的长度了。
static int checkStringLength(client *c, long long size) {
if (!(c->flags & CLIENT_MASTER) && size > server.proto_max_bulk_len) {
addReplyError(c,"string exceeds maximum allowed size (proto-max-bulk-len)");
return C_ERR;
}
return C_OK;
}
参考文档:
https://machbbs.com/v2ex/502001
https://github.com/redis/redis/pull/4633