ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

RedisÄÚ²¿Êý¾Ý½á¹¹Ïê½âÖ®ÕûÊý¼¯ºÏ(intset)(¶þ)
2014-11-24 03:13:33 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:7´Î
Tags£ºRedis ÄÚ²¿ Êý¾Ý½á¹¹ Ïê½â ÕûÊý ¼¯ºÏ intset
ts+to; bytes *= sizeof(int16_t); } memmove(dst,src,bytes); }

intsetUpdateAndAdd

//¶Ô±àÂëÀàÐͽøÐÐÉý¼¶£¬O(n)
//ÐèÒª²åÈëµÄÖµ£¬ÒªÃ´±Èµ±Ç°¼¯ºÏÖеÄ×î´óÖµ´ó£¬ÒªÃ´±È¼¯ºÏÖеÄ×îСֵС£¬²»È»²»ÐèÒªÉý¼¶
//±È×î´óÖµ´ó»¹ÊÇС£¬Ö»ÐèÒª¸ù¾ÝvalueµÄÕý¸º¼´¿ÉÅжÏ
static intset *intsetUpgradeAndAdd(intset *is, int64_t value) {
    uint8_t curenc = intrev32ifbe(is->encoding); //µ±Ç°±àÂëÀàÐÍ
    uint8_t newenc = _intsetValueEncoding(value);//еıàÂëÀàÐÍ
    int length = intrev32ifbe(is->length);
    int prepend = value < 0   1 : 0;//¾ö¶¨ÐµÄÖµ²åÈëµÄλÖÃ(1±íʾͷ£¬0±íʾβ)
    /* First set new encoding and resize */
    is->encoding = intrev32ifbe(newenc); //ÉèÖñàÂëÀàÐÍ
    is = intsetResize(is,intrev32ifbe(is->length)+1);//resize

    /* Upgrade back-to-front so we don't overwrite values.
     * Note that the "prepend" variable is used to make sure we have an empty
     * space at either the beginning or the end of the intset. */
    //ͨ¹ý_intsetGetEncodedµÃµ½Éý¼¶Ç°µÄ¸ÃλÖõÄÕûÊýÖµ
    //ÉèÖÃÔ­À´µÄÕûÊý¼¯µÄÖµ£¬Èç¹ûprepend=1±íʾÐÂÖµÔÚÍ·²åÈ룬ÄÇôԭÀ´µÄÊýֵȫ²¿ÏòºóÆ«ÒÆ
    while(length--)
        _intsetSet(is,length+prepend,_intsetGetEncoded(is,length,curenc));

    /* Set the value at the beginning or the end. */
    if (prepend) //ÔÚÍ·²åÈë
        _intsetSet(is,0,value);
    else //ÔÚβ²åÈë
        _intsetSet(is,intrev32ifbe(is->length),value);
    is->length = intrev32ifbe(intrev32ifbe(is->length)+1);
    return is;
}

intsetRemove

//ɾ³ýÒ»¸öÕûÊý
intset *intsetRemove(intset *is, int64_t value, int *success) {
    uint8_t valenc = _intsetValueEncoding(value);
    uint32_t pos;
    if (success) *success = 0;
    //valueÔÚÔ­¼¯ºÏÖÐ
    if (valenc <= intrev32ifbe(is->encoding) && intsetSearch(is,value,&pos)) {
        uint32_t len = intrev32ifbe(is->length);

        /* We know we can delete */
        if (success) *success = 1;

        /* Overwrite value with tail and update length */
        //Èç¹û pos ²»ÊÇ is µÄ×îĩβ£¬Ö±½Óͨ¹ýmemmoveÄڴ渲¸ÇµÄ·½Ê½É¾³ý¸ÃÕûÊýÖµ
        //Èç¹ûÊÇĩβ£¬Ö±½Óresizeɾ³ý
        if (pos < (len-1)) intsetMoveTail(is,pos+1,pos);
        is = intsetResize(is,len-1);//½«¿Õ¼äËõС
        is->length = intrev32ifbe(len-1);
    }
    return is;
}

intsetÌí¼ÓÔªËØÁ÷³Ìͼ

\

С½á

intsetÓÃÓÚÓÐÐò¡¢ÎÞÖØ¸´µØ±£´æ¶à¸öÕûÊýÖµ£¬Ëü»á¸ù¾ÝÔªËØµÄÖµ£¬×Ô¶¯Ñ¡Ôñ¸ÃÓÃʲô³¤¶ÈµÄÕûÊýÀàÐÍÀ´±£´æÔªËØ£»

µ±Ìí¼ÓÐÂÔªËØÊ±£¬ÐèÒªÅжϵ±Ç°intsetµÄ±àÂëÀàÐÍÄÜ·ñ±£´æÐÂÔªËØ£¬Èç¹û²»ÐÐÐèÒª¶Ôintset½øÐÐÉý¼¶£¬Éý¼¶ºóµÄintsetÖеÄÔªËØ»áÀ©´óÆäÕ¼ÓеÄ×Ö½ÚÊý£¬µ«ÊÇÖµ²»·¢Éú¸Ä±ä£»

intsetÖ»Ö§³ÖÉý¼¶£¬²»Ö§³Ö½µ¼¶£¬Òò´ËÏà¶Ô¶øÑÔ»áÀË·ÑÄڴ棻

intsetÖÐÔªËØÊÇÓÐÐòÅÅÁеģ¬Òò´ËʹÓÃÕÛ°ë²éÕÒµÄʱ¼ä¸´ÔÓ¶ÈΪO(logN)¡£

×îºó¸Ðл»Æ½¡ºê£¨huangz1990£©µÄRedisÉè¼ÆÓëʵÏÖ¼°ÆäËû¶ÔRedis2.6Ô´ÂëµÄÏà¹Ø×¢ÊͶÔÎÒÔÚÑо¿Redis2.8Ô´Âë·½ÃæµÄ°ïÖú¡£

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 2/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºRedisÄÚ²¿Êý¾Ý½á¹¹Ïê½âÖ®×Öµä(dic.. ÏÂһƪ£ºmongodb»ù´¡ÏµÁШD¸±±¾¼¯¾ßÌå´î½..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤C++ÖÐÖÇÄÜÖ¸ÕëµÄÐÔÄÜ (2025-12-25 03:49:29)
¡¤ÈçºÎÓÃÖÇÄÜÖ¸ÕëʵÏÖc (2025-12-25 03:49:27)
¡¤ÈçºÎÔÚ C ÓïÑÔÖйÜÀí (2025-12-25 03:20:14)
¡¤CÓïÑÔºÍÄÚ´æ¹ÜÀíÓÐʲ (2025-12-25 03:20:11)
¡¤ÎªÊ²Ã´CÓïÑÔ´Ó²»±»ÌÔ (2025-12-25 03:20:08)