国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redis五大類型分析--list(1)

這篇具有很好參考價值的文章主要介紹了redis五大類型分析--list(1)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

此篇為對redis五大數(shù)據(jù)類型中l(wèi)ist的分析,希望能有所幫助

?List API

listTypePush函數(shù)

void listTypePush(robj *subject, robj *value, int where) {

    /* 檢查編碼類型是否為 quicklist (快速列表) */
    if (subject->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 根據(jù)參數(shù) where 選擇插入位置,由 pos 保存插入位置信息 */
        int pos = (where == LIST_HEAD) ? QUICKLIST_HEAD : QUICKLIST_TAIL;

        /* value 為整數(shù)編碼 */
        if (value->encoding == OBJ_ENCODING_INT) {

            /* 將 value 先轉(zhuǎn)換為字符串 */
            char buf[32];
            ll2string(buf, 32, (long)value->ptr);

            /* 將元素插入列表 */
            quicklistPush(subject->ptr, buf, strlen(buf), pos);

        /* value 為字符串編碼 */
        } else {
            quicklistPush(subject->ptr, value->ptr, sdslen(value->ptr), pos);
        }
    } else {
        serverPanic("Unknown list encoding");
    }
}
分析:

該函數(shù)將一個元素插入到指定的列表對象 'subject',?插入位置由 'where' 決定是在列表頭部還是尾部插入,調(diào)用者不需要自己來增加 'value' 的 refcount,該函數(shù)會負(fù)責(zé)處理。

作用:

實現(xiàn)命令函數(shù)pushGenericCommand中會用到

 /* 讀取輸入的元素,并向列表插入元素 */
    for (j = 2; j < c->argc; j++) {
        listTypePush(lobj,c->argv[j],where);

        /* 臟數(shù)據(jù) + 1,即緩存中未保存到本地的數(shù)據(jù) */
        server.dirty++;
    }

實現(xiàn) lmove 命令中向目的列表(destination)插入元素中會用到

 /* 向列表中插入元素 */
    listTypePush(dstobj,value,where);

listPopSaver函數(shù)(用于給列表彈出的元素創(chuàng)建副本的函數(shù))

void *listPopSaver(unsigned char *data, size_t sz) {
    return createStringObject((char*)data,sz);
}
示例:

給quicklistPopCustom傳參用到

/* 從列表中彈出元素 */
        if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value,
                               NULL, &vlong, listPopSaver)) 

listTypePop函數(shù)(彈出列表元素的通用實現(xiàn)函數(shù))

robj *listTypePop(robj *subject, int where) {
    long long vlong;
    robj *value = NULL;

    /* 根據(jù)參數(shù) where 選擇插入位置,由 ql_where 保存插入位置信息 */
    int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL;

    /* 檢查編碼類型是否為 quicklist (快速列表) */
    if (subject->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 從列表中彈出元素 */
        if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value,
                               NULL, &vlong, listPopSaver)) {
            
            /* 如果 value 為 NULL ,則彈出元素被保存在 vlong 中(若不為 NULL 則說明保存在 value 中)
             * 則用 vlong 創(chuàng)建一個字符串對象并讓 value 對其引用 */
            if (!value)
                value = createStringObjectFromLongLong(vlong);
        }
    } else {
        serverPanic("Unknown list encoding");
    }
    return value;
}
示例:

?popGenericCommand函數(shù),彈出一個元素

/* 彈出一個元素,這是 pop 的原始操作,會向客戶端回復(fù)一個字符串 */
        value = listTypePop(o,where);

listTypeLength函數(shù)(獲取列表長度(元素總數(shù)))

unsigned long listTypeLength(const robj *subject) {
    if (subject->encoding == OBJ_ENCODING_QUICKLIST) {
        return quicklistCount(subject->ptr);
    } else {
        serverPanic("Unknown list encoding");
    }
}

listTypeInitIterator函數(shù)(在指定的索引處初始化一個列表迭代器)

listTypeIterator *listTypeInitIterator(robj *subject, long index,
                                       unsigned char direction) {

    /* 給列表迭代器分配內(nèi)存空間 */
    listTypeIterator *li = zmalloc(sizeof(listTypeIterator));

    /* 初始化列表迭代器 */
    li->subject = subject;
    li->encoding = subject->encoding;
    li->direction = direction;
    li->iter = NULL;
    /* LIST_HEAD means start at TAIL and move *towards* head.
     * LIST_TAIL means start at HEAD and move *towards* tail. */
    
    /* LIST_HEAD 意味著從列表尾部開始,并向頭部移動。
     * LIST_TAIL 表示從列表頭部開始,并向尾部移動 */
    int iter_direction =
        direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD;

    /* 檢查編碼類型是否為 quicklist (快速列表) */
    if (li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 初始化一個 quicklist 節(jié)點的迭代器,并且該迭代器指向列表的第 index 個元素,
         * 雖然用詞是”指向“但是迭代器并不是一個指針,而是個結(jié)構(gòu)體,它記錄的元素信息是列表第 index 個元素 */
        li->iter = quicklistGetIteratorAtIdx(li->subject->ptr,
                                             iter_direction, index);
    } else {
        serverPanic("Unknown list encoding");
    }
    return li;
}
用處:

linsertCommand函數(shù)中用于遍歷查找,初始化迭代器;在addListRangeReply函數(shù)中初始化范圍起點位置的迭代器?

listTypeSetIteratorDirection函數(shù)(設(shè)置迭代器的方向 )

void listTypeSetIteratorDirection(listTypeIterator *li, unsigned char direction) {
    li->direction = direction;
    int dir = direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD;
    quicklistSetDirection(li->iter, dir);
}

listTypeReleaseIterator函數(shù)(釋放迭代器)

void listTypeReleaseIterator(listTypeIterator *li) {
    quicklistReleaseIterator(li->iter);
    zfree(li);//redis定義的一個函數(shù),在free函數(shù)的基礎(chǔ)上有改變
}

基本上跟在listTypeInitIterator函數(shù)后面,釋放迭代器

listTypeNext函數(shù)

int listTypeNext(listTypeIterator *li, listTypeEntry *entry) {
    /* Protect from converting when iterating */
    /* 保護(hù)迭代時編碼不被轉(zhuǎn)換,則需要迭代器記錄的編碼類型和迭代器指向的列表對象編碼一致 */
    serverAssert(li->subject->encoding == li->encoding);

    /* 將參數(shù) li 賦值給參數(shù) entry 的迭代器成員 */
    entry->li = li;

    /* 檢查編碼類型是否為 quicklist (快速列表) */
    if (li->encoding == OBJ_ENCODING_QUICKLIST) {

        /* 調(diào)用 quicklistNext 函數(shù)獲取下一個元素,
         * 元素 (quicklistEntry) 保存在 entry->entry 中,并推進(jìn)迭代器位置
         * 如果 下一個元素存在,該函數(shù)返回1,否則返回0 */
        return quicklistNext(li->iter, &entry->entry);
    } else {
        serverPanic("Unknown list encoding");
    }
    return 0;
}
分析:

?獲取迭代器指向元素的下一個元素,并推進(jìn)迭代器的位置(推進(jìn)方向由迭代器成員 direction 決定)。?如果 entry(下一個元素) 存在,返回1,否則返回0?

用處:

linsertCommand函數(shù)中用于遍歷查找,在addListRangeReply函數(shù)中設(shè)置迭代器的范圍起點位置

總結(jié):

本篇分析了listpush,popsaver,poplength函數(shù),對列表彈出元素和計算列表長度的功能進(jìn)行分析,同時還分析了關(guān)于迭代器初始化,設(shè)置方向,釋放和獲取迭代器下一個元素的函數(shù),對迭代器的功能進(jìn)行分析。文章來源地址http://www.zghlxwxcb.cn/news/detail-637281.html

到了這里,關(guān)于redis五大類型分析--list(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Redis五大數(shù)據(jù)類型

    Redis五大數(shù)據(jù)類型

    Redis-Key 官網(wǎng):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 設(shè)置過期時間,以秒計 5 EXPIREAT key timestamp E

    2024年02月11日
    瀏覽(18)
  • 【Redis】五大數(shù)據(jù)類型

    【Redis】五大數(shù)據(jù)類型

    ??Redis支持五種數(shù)據(jù)類型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sorted set有序集合)。 Redis的String類型是一種最基本的數(shù)據(jù)類型,它是一個鍵值對的存儲結(jié)構(gòu),其中鍵和值都是字符串類型。String類型的特點是快速存儲和讀取,適用于存儲一些簡單的數(shù)據(jù),如字符

    2024年02月12日
    瀏覽(21)
  • 【Redis】五大數(shù)據(jù)類型(操作命令)

    【Redis】五大數(shù)據(jù)類型(操作命令)

    ??Redis 鍵(key) 這些是 Redis 數(shù)據(jù)庫中的命令,用于對數(shù)據(jù)類型進(jìn)行操作和管理。以下是每個命令的含義和用法: DEL:刪除一個或多個鍵。 DUMP:將一個鍵的值轉(zhuǎn)儲到一個字符串中。 EXPIRE:設(shè)置鍵的過期時間。 EXPIREAT:在給定的時間戳之后為鍵設(shè)置過期時間。 KEYS:返回匹配給

    2024年02月13日
    瀏覽(49)
  • Redis入門-redis的五大數(shù)據(jù)類型+三種特殊的數(shù)據(jù)類型

    Redis入門-redis的五大數(shù)據(jù)類型+三種特殊的數(shù)據(jù)類型

    Redis有 五大基本類型 : 字符串(string) 、 哈希(hash) 、 列表(list) 、 集合(set) 和 有序集合(sorted set) 。 字符串(string)是Redis最基本的類型,可以存儲任意類型的數(shù)據(jù) ,如整數(shù)、浮點數(shù)、二進(jìn)制數(shù)據(jù)等。字符串類型的操作包括設(shè)置鍵值對、獲取值、增減值等。

    2024年01月21日
    瀏覽(21)
  • Redis五大數(shù)據(jù)類型以及相關(guān)操作

    keys * 查看當(dāng)前庫的所有鍵 exists key 判斷某個鍵是否存在 type key 查看鍵的類型 del key 刪除某個鍵 expire key seconds 為鍵值設(shè)置過期時間,單位秒 ttl key 查看還有多久過期,-1表示永不過期,-2表示已過期 dbsize 查看當(dāng)前數(shù)據(jù)庫中key的數(shù)量 flushdb 清空當(dāng)前庫 Flushall 通殺全部庫 String類型

    2024年02月02日
    瀏覽(29)
  • Redis(二)—— 五大基本數(shù)據(jù)類型和三大特殊數(shù)據(jù)類型

    Redis(二)—— 五大基本數(shù)據(jù)類型和三大特殊數(shù)據(jù)類型

    1、常用命令 ?批量操作: redis可以定義對象? 方式(一) :以JSON格式(其實就是key-value格式)保存一個對象 方式(二) : 把對象的兩個屬性定義成兩個key 注意,如果采用第一種方式,那么無法單獨取出字段哦~ 2、使用場景 數(shù)字int類型的string作為計數(shù)器,比如統(tǒng)計文章的

    2024年02月15日
    瀏覽(16)
  • 【Redis高手修煉之路】②Redis的五大數(shù)據(jù)類型

    【Redis高手修煉之路】②Redis的五大數(shù)據(jù)類型

    字符串是Redis最基礎(chǔ)的數(shù)據(jù)類型: 字符串類型實際可以存儲字符串、數(shù)字、二進(jìn)制數(shù)據(jù); Redis中的鍵都是字符串類型,值也支持字符串類型; 字符串類型的存儲空間是有限的,最大可以存放512M的數(shù)據(jù)。 1.1.1 添加、查詢、獲取長度、字符串的追加 set key value 設(shè)置指定 key 的值 get

    2023年04月19日
    瀏覽(25)
  • Redis的五大數(shù)據(jù)類型及其使用場景

    redis是一個非??焖??的非關(guān)系數(shù)據(jù)庫??解決方案。其簡單的鍵值數(shù)據(jù)模型使 Redis 能夠處理大型數(shù)據(jù)集,同時保持令人印象深刻的讀寫速度和可用性。?redis提供了五種數(shù)據(jù)類型,分別是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sor

    2024年02月16日
    瀏覽(18)
  • 淺談Redis的五大數(shù)據(jù)類型及其應(yīng)用

    淺談Redis的五大數(shù)據(jù)類型及其應(yīng)用

    ????????Redis是一種開源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),它支持多種數(shù)據(jù)類型,包括字符串String、列表list、集合、哈希表和有序集合。這些數(shù)據(jù)類型在Redis中有著廣泛的應(yīng)用場景,可以滿足不同的業(yè)務(wù)需求。本文將介紹Redis的五大數(shù)據(jù)類型及其應(yīng)用。 常用命令: ?? ?最常用:

    2024年02月06日
    瀏覽(24)
  • Redis五大基本數(shù)據(jù)類型及其使用場景

    Redis五大基本數(shù)據(jù)類型及其使用場景

    Nosql = not only sql(不僅僅是SQL) 關(guān)系型數(shù)據(jù)庫:列+行,同一個表下數(shù)據(jù)的結(jié)構(gòu)是一樣的。 非關(guān)系型數(shù)據(jù)庫:數(shù)據(jù)存儲沒有固定的格式,并且可以進(jìn)行橫向擴(kuò)展。 NoSQL泛指非關(guān)系型數(shù)據(jù)庫,隨著web2.0互聯(lián)網(wǎng)的誕生,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難對付web2.0大數(shù)據(jù)時代!尤其是超大規(guī)

    2024年02月12日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包