Redis之字符串对象源码阅读

checkStringLength:检查字符串的大小是否超过512MB,超过返回 REDIS_ERR ,未超过返回 REDIS_OK

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;
}

setCommand:执行客户端发送的set命令

void setCommand(redisClient *c) {
    int j;
    robj *expire = NULL;
    int unit = UNIT_SECONDS;
    int flags = REDIS_SET_NO_FLAGS;

    // 设置选项参数
    for (j = 3; j < c->argc; j++) {
        char *a = c->argv[j]->ptr;
        robj *next = (j == c->argc-1) ? NULL : c->argv[j+1];

        if ((a[0] == 'n' || a[0] == 'N') &&
            (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') {
            flags |= REDIS_SET_NX;
        } else if ((a[0] == 'x' || a[0] == 'X') &&
                   (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') {
            flags |= REDIS_SET_XX;
        } else if ((a[0] == 'e' || a[0] == 'E') &&
                   (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) {
            unit = UNIT_SECONDS;
            expire = next;
            j++;
        } else if ((a[0] == 'p' || a[0] == 'P') &&
                   (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) {
            unit = UNIT_MILLISECONDS;
            expire = next;
            j++;
        } else {
            addReply(c,shared.syntaxerr);
            return;
        }
    }

    // 尝试对值对象进行编码
    c->argv[2] = tryObjectEncoding(c->argv[2]);

    setGenericCommand(c,flags,c->argv[1],c->argv[2],expire,unit,NULL,NULL);
}

在这个方法里面会将用户输入的参数进行解析最终传递给setGenericCommand方法添加到数据库中:

void setGenericCommand(redisClient *c, int flags, robj *key, robj *val, robj *expire, int unit, robj *ok_reply, robj *abort_reply) {

    long long milliseconds = 0; /* initialized to avoid any harmness warning */

    // 取出过期时间
    if (expire) {

        // 取出 expire 参数的值
        // T = O(N)
        if (getLongLongFromObjectOrReply(c, expire, &milliseconds, NULL) != REDIS_OK)
            return;

        // expire 参数的值不正确时报错
        if (milliseconds <= 0) {
            addReplyError(c,"invalid expire time in SETEX");
            return;
        }

        // 不论输入的过期时间是秒还是毫秒
        // R
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis是一个开的、使用C语言编写的高性能键值对存储数据库,其码注释主要包含了对Redis的各个组件、模块、函数等的详细说明,方便开发者理解和使用Redis。 在Redis 7.0的码注释中,包含了对Redis的基本结构、数据类型、内存管理、数据库操作、网络通信等方面的注释。 在基本结构方面,码注释详细介绍了Redis的整体架构和模块之间的关系,如服务器结构、客户端结构、数据库结构等。这些注释帮助开发者了解Redis的组成部分,有助于对Redis进行二次开发和定制化。 在数据类型方面,可以找到对Redis支持的各种数据类型(如字符串、列表、哈希表、有序集合等)的码注释。这些注释详细说明了数据类型的实现原理和内部数据结构,以及对应操作的时间复杂度等信息,有助于开发者在使用Redis时了解其内部实现机制和使用方法。 在内存管理方面,Redis码注释解释了Redis对内存的分配和释放,并介绍了部分内存管理的原理和策略,如对象引用计数、内存回收等。这些注释可以帮助开发者理解Redis在内存管理方面的设计和优化。 在数据库操作方面,Redis码注释提供了对数据库的增删改查操作的详细注释,包括对集合操作、哈希表操作、有序集合操作等。这些注释可以帮助开发者了解Redis对数据的存储和操作方式,以及相应的数据结构和算法。 在网络通信方面,Redis码注释包含了对网络连接、通信协议、命令解析等的详细说明。这些注释帮助开发者了解Redis与客户端之间的通信机制,以及如何解析和处理客户端发送的命令。 总之,Redis 7.0码注释提供了对Redis各个方面的详细解释,帮助开发者理解Redis的内部结构、实现原理和使用方式,是开发者学习和使用Redis的重要参考资料。 ### 回答2: Redis 7.0是一款开的、高性能的、支持多种数据结构的内存数据库。在Redis 7.0的码注释中,涉及了许多关键的实现细节、数据结构定义和算法逻辑。 首先,Redis 7.0的码注释提供了对各个函数和模块的详细解释。这些注释能够帮助开发人员更好地理解代码的功能和实现方式,提供了方便的参考和指导。例如,对于关键数据结构如字符串、哈希表、链表等的定义和使用都有详细的注释说明,帮助开发人员了解其内部实现原理和使用方式。 其次,Redis 7.0的码注释还包含了算法的解释和优化思路。对于一些关键算法,如缓存淘汰算法、订阅与发布算法等,注释中详细解释了其实现原理和性能优化的思路。这对于开发人员来说是非常有价值的,可以帮助他们更好地理解和改进Redis的性能和功能。 此外,Redis 7.0的码注释还包括了对一些重要模块和功能的解释。例如,对于多线程支持的相关代码和模块,注释中详细解释了其原理和使用方式,以及相关的并发控制策略。这可以帮助开发人员更好地理解和使用Redis的多线程功能,提高系统的并发处理能力。 总而言之,Redis 7.0码注释对于开发人员来说是一份非常宝贵的文档。它提供了对代码的详细解释和说明,包括数据结构定义、算法实现和模块功能等方面。这些注释可以帮助开发人员更加深入地理解和使用Redis,并为他们在解决问题和优化性能时提供有价值的参考和指导。 ### 回答3: Redis 7.0 是 Redis 数据库的一个版本,以下是对该版本码注释的简要解释: Redis 7.0 的码注释主要用于解释 Redis 数据库中的各个函数、数据结构和算法的功能和实现原理。 在 Redis 7.0 的码中,注释被用来解释函数的输入参数和返回值、函数的作用、关键算法的实现细节以及代码的逻辑结构等等。注释帮助开发者理解和使用码,对于对 Redis 进行二次开发或者进行排错、优化也起到了重要作用。 码注释提供了对 Redis 各个模块和功能的清晰解释,例如底层的数据类型实现、线程模型、COW(copy-on-write)策略等等。同时,注释还覆盖了 Redis 7.0 引入的新功能和改进。例如,Redis 7.0 可能引入了新的数据结构或者命令,这些新功能的实现细节可能在注释中有所描述。 此外,Redis 7.0 的码注释还可能包含一些重要的注释块,其中包括一些算法和数据结构的详细解释,这有助于开发者深入了解 Redis 内部的运作方式。 需要注意的是,Redis 7.0 的码注释是用来帮助开发者理解码的,因此在实际运行时会被编译器忽略掉。因此,在阅读和使用码时,我们需要同时参考码注释和实际代码实现来全面理解 Redis 的工作机制。 总之,Redis 7.0 的码注释对于开发者来说是一份重要的参考资料,能够帮助他们理解 Redis 的工作原理和实现方式,从而更好地使用和扩展 Redis 数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值