redis五大类型分析--list(2)

这篇具有很好参考价值的文章主要介绍了redis五大类型分析--list(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此篇为对redis五大数据类型中list的分析,希望能有所帮助

 List API

 listTypeGet函数

robj *listTypeGet(listTypeEntry *entry) {
    robj *value = NULL;

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 元素的值保存在 value 中 */
        if (entry->entry.value) {
            
            /* value = 使用当前元素创建的字符串对象 */
            value = createStringObject((char *)entry->entry.value,
                                       entry->entry.sz);
        
        /* 元素的值保存在 longval 中 */
        } else {

            /* value = 使用当前(整型)元素创建的字符串对象 */
            value = createStringObjectFromLongLong(entry->entry.longval);
        }
    } else {
        serverPanic("Unknown list encoding");
    }
    return value;
}
分析:

利用createStringObject函数和createStringObjectFromLongLong函数,检查编码类型并获取元素的值

listTypeInsert函数

void listTypeInsert(listTypeEntry *entry, robj *value, int where) {

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 获取解码后的 value(实际上是让编码为INT的 value 转为字符串形式(raw 或 embstr))*/
        value = getDecodedObject(value);

        /* 令 str = value(字符串值),len = value 字符串长度 */
        sds str = value->ptr;
        size_t len = sdslen(str);

        /* 在 entry 后方插入元素 */
        if (where == LIST_TAIL) {
            quicklistInsertAfter(entry->li->iter, &entry->entry, str, len);
        
        /* 在 entry 前方插入元素 */
        } else if (where == LIST_HEAD) {
            quicklistInsertBefore(entry->li->iter, &entry->entry, str, len);
        }

        /* value 的被引用次数 -1 ,value 被引用次数为0时将被释放 */
        decrRefCount(value);
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

对entry的插入操作,在 entry 的位置前或后方插入元素 value 

listTypeReplace函数

void listTypeReplace(listTypeEntry *entry, robj *value) {

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 获取解码后的 value(实际上是让编码为INT的 value 转为字符串形式(raw 或 embstr))*/
        value = getDecodedObject(value);

        /* 令 str = value(字符串值),len = value 字符串长度 */
        sds str = value->ptr;
        size_t len = sdslen(str);

        /* 用 value 替换 entry 中的元素 */
        quicklistReplaceEntry(entry->li->iter, &entry->entry, str, len);

        /* value 的被引用次数 -1 ,value 被引用次数为0时将被释放 */
        decrRefCount(value);
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

替换 entry 中的元素 

listTypeEqual函数

int listTypeEqual(listTypeEntry *entry, robj *o) {

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 使用断言确保 o 内部编码为字符串(raw 或 embstr) */
        serverAssertWithInfo(NULL,o,sdsEncodedObject(o));

        /* 调用比较函数进行比较,相同返回1,不相同返回0 */
        return quicklistCompare(&entry->entry,o->ptr,sdslen(o->ptr));
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

在当前位置比较两个元素是否相同

listTypeDelete函数

void listTypeDelete(listTypeIterator *iter, listTypeEntry *entry) {

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 调用删除函数将元素删除 */
        quicklistDelEntry(iter->iter, &entry->entry);
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

删除元素

listTypeDup函数

/* This is a helper function for the COPY command.
 * Duplicate a list object, with the guarantee that the returned object
 * has the same encoding as the original one.
 *
 * The resulting object always has refcount set to 1 */

robj *listTypeDup(robj *o) {
    robj *lobj;

    /* 使用断言确保 o 类型为列表 */
    serverAssert(o->type == OBJ_LIST);

    switch (o->encoding) {
        
        /* 检查编码类型是否为 quicklist (快速列表) */
        case OBJ_ENCODING_QUICKLIST:

            /* 创建 o 的副本 lobj */
            lobj = createObject(OBJ_LIST, quicklistDup(o->ptr));
            lobj->encoding = o->encoding;
            break;
        default:
            serverPanic("Unknown list encoding");
            break;
    }
    return lobj;
}
分析:

检查编码类型,辅助copy命令。复制一个列表对象,并保证返回的对象具有与原始对象相同的编码。返回的对象总是将 refcount 设置为1 

listTypeDelRange函数

/* Delete a range of elements from the list. */

int listTypeDelRange(robj *subject, long start, long count) {

    /* 检查编码类型是否为 quicklist (快速列表) */
    if (subject->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 调用范围删除函数进行删除 */
        return quicklistDelRange(subject->ptr, start, count);
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

在列表中删除一个指定范围内的元素

总结:

本篇分析了 listTypeGet函数、listTypeInsert函数、listTypeReplace函数、listTypeEqual函数等API,即将元素的增删改操作具体分析,有助于更好地理解list类型的操作。文章来源地址https://www.toymoban.com/news/detail-665544.html

到了这里,关于redis五大类型分析--list(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Redis】五大数据类型

    💭Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sorted set有序集合)。 Redis的String类型是一种最基本的数据类型,它是一个键值对的存储结构,其中键和值都是字符串类型。String类型的特点是快速存储和读取,适用于存储一些简单的数据,如字符

    2024年02月12日
    浏览(40)
  • Redis五大数据类型

    Redis-Key 官网:https://www.redis.net.cn/order/ 序号 命令语法 描述 1 DEL key 该命令用于在 key 存在时删除 key 2 DUMP key 序列化给定 key ,并返回被序列化的值 3 EXISTS key 检查给定 key 是否存在,存在返回1,否则返回0 4 EXPIRE key seconds 为给定 key 设置过期时间,以秒计 5 EXPIREAT key timestamp E

    2024年02月11日
    浏览(39)
  • Redis五大基础类型解析

    1.String类型 特征:即存储字符串的类型,单个字符串存储量最大不超过512MB 常用业务场景:⽤来存储JSON序列化之后对象 底层编码: int编码 数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而且数组中元素只能为数字 使⽤要求:每⼀个字符必须是数字 EmbStr编

    2024年02月15日
    浏览(30)
  • 【Redis】五大数据类型(操作命令)

    🚩Redis 键(key) 这些是 Redis 数据库中的命令,用于对数据类型进行操作和管理。以下是每个命令的含义和用法: DEL:删除一个或多个键。 DUMP:将一个键的值转储到一个字符串中。 EXPIRE:设置键的过期时间。 EXPIREAT:在给定的时间戳之后为键设置过期时间。 KEYS:返回匹配给

    2024年02月13日
    浏览(61)
  • Redis入门-redis的五大数据类型+三种特殊的数据类型

    Redis有 五大基本类型 : 字符串(string) 、 哈希(hash) 、 列表(list) 、 集合(set) 和 有序集合(sorted set) 。 字符串(string)是Redis最基本的类型,可以存储任意类型的数据 ,如整数、浮点数、二进制数据等。字符串类型的操作包括设置键值对、获取值、增减值等。

    2024年01月21日
    浏览(44)
  • Redis五大数据类型以及相关操作

    keys * 查看当前库的所有键 exists key 判断某个键是否存在 type key 查看键的类型 del key 删除某个键 expire key seconds 为键值设置过期时间,单位秒 ttl key 查看还有多久过期,-1表示永不过期,-2表示已过期 dbsize 查看当前数据库中key的数量 flushdb 清空当前库 Flushall 通杀全部库 String类型

    2024年02月02日
    浏览(39)
  • Redis(二)—— 五大基本数据类型和三大特殊数据类型

    1、常用命令  批量操作: redis可以定义对象  方式(一) :以JSON格式(其实就是key-value格式)保存一个对象 方式(二) : 把对象的两个属性定义成两个key 注意,如果采用第一种方式,那么无法单独取出字段哦~ 2、使用场景 数字int类型的string作为计数器,比如统计文章的

    2024年02月15日
    浏览(38)
  • 【Redis高手修炼之路】②Redis的五大数据类型

    字符串是Redis最基础的数据类型: 字符串类型实际可以存储字符串、数字、二进制数据; Redis中的键都是字符串类型,值也支持字符串类型; 字符串类型的存储空间是有限的,最大可以存放512M的数据。 1.1.1 添加、查询、获取长度、字符串的追加 set key value 设置指定 key 的值 get

    2023年04月19日
    浏览(43)
  • Redis的五大数据类型及其使用场景

    redis是一个非常快速‎‎的非关系数据库‎‎解决方案。其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。‎redis提供了五种数据类型,分别是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sor

    2024年02月16日
    浏览(41)
  • Redis五大基本数据类型及其使用场景

    Nosql = not only sql(不仅仅是SQL) 关系型数据库:列+行,同一个表下数据的结构是一样的。 非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。 NoSQL泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0大数据时代!尤其是超大规

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包