[转帖]为什么redis的SDS的最大长度限制为512mb?

为什么,redis,sds,最大,长度,限制,512mb · 浏览次数 : 0

小编点评

**限制字符串大小** 在 Redis 中,`checkStringLength` 方法用于检查字符串长度是否超过 512 MB。在不同的版本中,该方法的限制有所不同: **Redis 6.2.7 版本** * 使用 `server.proto_max_bulk_len` 读取配置参数。 * 如果字符串长度超过 `server.proto_max_bulk_len`,则返回值 `C_ERR`。 **Redis 4.0.14 和 5.0.9 版本** * 使用 `512*1024*1024` 的限制。 **Redis 3.2.13 版本** * 使用 `512*1024*1024` 的限制。 **原因** 由于 Redis 是一个并发的系统,字符串的存储效率可能因服务器配置而有所不同。在 512 MB 之类的字符串长度范围内,不同的版本可能使用不同的最大长度。 **解决方案** 您可以通过以下两种方法之一解决字符串长度限制: * 使用 `server.proto_max_bulk_len` 从服务器配置中获取字符串长度限制。 * 将字符串存储为多个部分,每个部分不超过 512 MB。

正文

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

      与[转帖]为什么redis的SDS的最大长度限制为512mb?相似的内容:

      [转帖]为什么redis的SDS的最大长度限制为512mb?

      当客户端操作 client 时,一般不会直接使用 sds ,而是通过对象的方式来使用。比如创建的字符串其实是一个对象,间接使用到了 sds 结构。限制 512M 的逻辑在 t_string.c 的 checkStringLength 方法。 在redis3.2.13、redis4.0.14、redi

      [转帖]Redis进阶实践之四Redis的基本数据类型

      一、引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型。Redis为什么会比以前的Memchaed等内存缓存软件使用的更频繁,适用范围更广呢?就是因为Redis使用起来更方便,之所以方便,是因为Redis支持的数据类型比以前的Memchaed缓存支持数据类型

      [转帖]高性能IO模型:为什么单线程Redis能那么快?

      https://zhuanlan.zhihu.com/p/596170085 你好,我是蒋德钧。 今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的Redis能那么快?” 首先,我要和你厘清一个事实,我们通常说,Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的

      [转帖]删除数据后的Redis内存占用率为什么还是很高?

      https://zhuanlan.zhihu.com/p/490569316 有时候Redis明明做了数据删除,数据量已经不大了,但是使用top命令的时候,还会发现Redis占用了很多内存? PS:关于 Redis的高并发及高可用,到底该如何保证?可以参考下这个帖子:httss://http://z

      [转帖]玩转REDIS-删除了两百万KEY,为什么内存依旧未释放?

      https://www.freesion.com/article/87101375552/ 《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【12】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百度搜索“玩转Redis zxiaof

      [转帖]Redis系列(十六)、Redis6新特性之IO多线程

      https://blog.csdn.net/wsdc0521/article/details/106766587 终于,Redis的多线程版本横空出世,大大提高了并发,本篇就带大家来看看什么是IO多线程,和我们理解的多线程有什么区别,与Memcached的多线程又有什么区别。 目录 介绍 为什么Re

      [转帖]redis bigkey 删除问题

      一、慢操作分析 redis 的慢操作已经有了,如果没有,我们可以自己去 redis 服务器查看历史的慢日志操作,或者有对应的慢操作监控系统也可以发现问题,这里不做展开。 接下来我们就要看一看为什么这么慢。 看了下项目中的实现代码,结合日志一分析,发现是一个 redis bigkey。 一个 redi

      [转帖]Redis 哨兵模式(Sentinel) 原理

      https://juejin.cn/post/6865687858905088008知道的还是太少呢. 为什么需要哨兵模式(Sentinel) 只依靠持久化方案,在服务器下线后无法恢复服务 使用主从复制,在 master 节点下线后,可以手动将 slave 节点切换为 master,但是不能自动完成

      [转帖]一致性哈希 和 Redis 集群分槽

      前言 伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数

      [转帖]Redis进阶实践之十七 Redis协议的规范

      https://www.cnblogs.com/PatrickLiu/p/8567453.html 一、介绍 Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门为Redis设计的,但是该协议也可以用于其他 客户端-服务器 (Client-Se