Redis×ÖµäÆäʵ¾ÍÊÇHash±í£¬ÆäʵÏÖºÍJAVAÓïÑÔÖеÄhashmap½á¹¹´óͬСÒ죬°´Key-Value·½Ê½´æ´¢¼üÖµ¶Ô£¬µ«ÊÇÓÖ´æÔÚÒ»¶¨µÄ²îÒì¡£
javaÖеÄhashmap½á¹¹¼´°üº¬hash±í£¬ÓÖʵÏÖÁËrehash×ÔÎÒÀ©³ä£»
¶øredis×ÖµäÔòͨ¹ýdictht½á¹¹ÊµÏÖhash±í£¬Í¨¹ý×ֵ䣨dict£©ÊµÏÖrehash£¨×ÖµäÖаüº¬Ò»¸ödicthtÊý×édictht ht[2]£©¡£
Redis×ÖµäµÄʵÏÖ
Redis×ÖµäËùʹÓõĹþÏ£±íÓÉdict.h/dictht½á¹¹¶¨Ò壺
typedef struct dictht{
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
}dictht;
tableΪһ¸ödictEntry½á¹¹µÄÊý×飬ÿ¸ödictEntry½á¹¹±£´æ×ÅÒ»¸ökey-value¶Ô¡£sizeΪtableÊý×éµÄ´óС£¨×¢Òâ²»ÊÇkey-value¶ÔµÄ¸öÊý£©£»used²ÅÊÇkey-value¶ÔµÄ¸öÊý£»sizemaskΪsize-1£¬ÓÃ;ºóÃæ»áÌáµ½£»
dictEntry½á¹¹¶¨ÒåÈçÏ£º
typedef struct dictEntry{
void *key;
union{
void *val;
uint64_t u64;
int64_t s64;
} v;
struct dictEntry *next;
}
key¼´Îª¼ü£¬v¼´ÎªÖµ£¬Óɶ¨Òå¿ÉÒÔ¿´³ö£¬v¼È¿ÉÒÔÊÇÒ»¸öÖ¸Õ룬Ҳ¿ÉÒÔÊÇÒ»¸öuint64_tÕûÊý»òÕßint64_tÕûÊý¡£
nextÊôÐÔÖ¸ÏòÏÂÒ»¸ödictEntry£¬ÐγÉÁ´±í½á¹¹¡£ÔÚ×Öµä½á¹¹ÖУ¬Ã¿Ò»¸ökey-valueÖеÄkeyµÄhashÖµÓ³Éäµ½tableµÄϱ꣬Èç¹ûÓжà¸ökeyµÄhashÖµÓ³Éäµ½tableµÄͬһ¸öϱ꣬ÔòÕâЩkey-value¶Ô½«Í¨¹ý nextÖ¸ÕëÐγÉÒ»¸öÁ´±í£¬´æµ½tableµÄµ±Ç°Ï±êÖС£
RedisÖеÄ×ÖµäÓÉdict.h/dict½á¹¹±íʾ£º
typedef struct dict{
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx;
} dict;
×¢Òâµ½£¬ÆäÖУº
dictht¼´ÎªÇ°Ãæ½éÉܵĹþÏ£±í½á¹¹£» typeÖ¸ÕëΪһ¸ödictType½á¹¹£¬¸Ã½á¹¹±£´æÁËһЩÓÃÓÚ²Ù×÷ÌØ¶¨ÀàÐͼüÖµ¶ÔµÄº¯Êý£¬Redis»áΪÓÃ;²»Í¬µÄ×ÖµäÉèÖò»Í¬µÄÀàÐÍÌØ¶¨º¯Êý£» privdataÔò±£´æÁËÐèÒª´«µÝ¸øtypeÖÐÌØ¶¨º¯ÊýµÄ¿ÉÑ¡²ÎÊý£»
dictType½á¹¹ÈçÏ£º typedef struct dictType{
//¼ÆËãhashÖµ
unsigned int (*hashFunction)(const void *key);
//¸´ÖƼü
void *(*keyDup)(void *privdata,const void *key);
//¸´ÖÆÖµ
void *(*valDup)(void *privdata,const void *obj);
//¶Ô±È¼ü
int *(*keyCOmpare)(void *privdata,const void *key1,const void *key2);
//Ïú»Ù¼ü
void (*keyDestructor)(void *privdata,void *key);
//Ïú»ÙÖµ
void (*valDestructor)(void *privdata,void *obj);
}dictType;
htÊý×éÔò°üº¬2¸ödictht½á¹¹£¬Æ½Ê±Ö»Ê¹ÓÃht[0]£¬ÔÚrehashµÄʱºòʹÓÃht[1]£» rehashidxÔòΪһ¸ö±ê־룬Èç¹ûµ±Ç°Ã»ÓÐÔÚ½øÐÐrehash£¬ÔòֵΪ-1£»redisͨ¹ý½¥½ø·½Ê½½øÐÐrehash£¬rehashÆÚ¼ä£¬Ã¿Ö´ÐÐÒ»´Î²Ù×÷£¬ÔòrehashidxÖµ¼Ó1£» Redis¹þÏ£Ëã·¨
£¨Î´Íê´ýÐø¡£¡£¡££©