首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Redis的string门类之512MB限制

2013-10-15 
Redis的string类型之512MB限制本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/art

Redis的string类型之512MB限制

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/12720849

 

网上有很多文章关于redis的string类型长度限制的。有的说512MB,有的说1GB。

当通过文字无法确定文章作者是否在瞎扯的时候,你可以直接猜想作者是在瞎鸡巴扯。

所有的文档都不是绝对可靠的,唯一可靠的只有源代码(source code)。

我们来看一下源代码里怎么实现这个逻辑的。

static int checkStringLength(redisClient *c, long long size) {    if (size > 512*1024*1024) {        addReplyError(c,"string exceeds maximum allowed size (512MB)");        return REDIS_ERR;    }    return REDIS_OK;}

一看就明白了。

这个函数什么时候被调用呢?

任何输入字符串类命令都会调用这个函数做检查,比如:

void appendCommand(redisClient *c) {    size_t totlen;    robj *o, *append;    o = lookupKeyWrite(c->db,c->argv[1]);    if (o == NULL) {        /* Create the key */        c->argv[2] = tryObjectEncoding(c->argv[2]);        dbAdd(c->db,c->argv[1],c->argv[2]);        incrRefCount(c->argv[2]);        totlen = stringObjectLen(c->argv[2]);    } else {        /* Key exists, check type */        if (checkType(c,o,REDIS_STRING))            return;        /* "append" is an argument, so always an sds */        append = c->argv[2];        totlen = stringObjectLen(o)+sdslen(append->ptr);        if (checkStringLength(c,totlen) != REDIS_OK)            return;        /* If the object is shared or encoded, we have to make a copy */        if (o->refcount != 1 || o->encoding != REDIS_ENCODING_RAW) {            robj *decoded = getDecodedObject(o);            o = createStringObject(decoded->ptr, sdslen(decoded->ptr));            decrRefCount(decoded);            dbOverwrite(c->db,c->argv[1],o);        }        /* Append the value */        o->ptr = sdscatlen(o->ptr,append->ptr,sdslen(append->ptr));        totlen = sdslen(o->ptr);    }    signalModifiedKey(c->db,c->argv[1]);    server.dirty++;    addReplyLongLong(c,totlen);}



 

 

热点排行