为什么redis的SDS的最大长度限制为512mb?

从Redis 3.2.13到6.2.7版本,字符串最大长度的限制经历了从固定512MB到动态读取配置proto-max-bulk-len的变化。在早期版本中,checkStringLength方法硬编码限制为512MB,而在Redis 6.2.7及后续版本,该限制改为了可配置,允许更大的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当客户端操作 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;
}

参考文档:

http://www.shutdown.cn/post/why-redis-sds-max-length-limit-is-512mb/

https://machbbs.com/v2ex/502001

https://github.com/redis/redis/pull/4633

https://machbbs.com/v2ex/502001

https://github.com/redis/redis/issues/7354

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值