redis dict

redis dict

dict代表整个字典,内部有两个dictht, 以实现增量hash(将ht[0]中的值rehash到ht[1]中),

rehashidx是下一个需要rehash的项在ht[0]中的索引,不需要rehash时置为-1,

iterators记录当前dict中的迭代器数,主要是为了避免在有迭代器时rehash,在有迭代器时rehash可能会造成值的丢失或重复,

type的类型dictType是一组函数指针,表示该怎样哈希、复制、释放key,该怎样复制、释放value;

dictht中的table是一个数组+指针形式的hash表,size表hash数组(桶)的大小,used表示hash表的元素个数,这两个值与rehash、resize过程密切相关。sizemask等于size-1,这是为了方便将hash值映射到数组中。typedef struct dictEntry {

typedef struct dictEntry { 
   void *key;
     void *val;
     struct dictEntry *next;
} dictEntry;

typedef  struct dictType {
    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;

/*  This is our hash table structure. Every dictionary has two of this as we
 * implement incremental rehashing, for the old to the new table. 
*/
#ifdef _WIN32
typedef  struct dictht {
    dictEntry **table;
    size_t size;
    size_t sizemask;
    size_t used;
} dictht;
#else
typedef  struct dictht {
    dictEntry **table;
    unsigned  long size;
    unsigned  long sizemask;
    unsigned  long used;
} dictht;
#endif

typedef  struct dict {
    dictType *type;
     void *privdata;
    dictht ht[2];
     int rehashidx;  /*  rehashing not in progress if rehashidx == -1  */
     int iterators;  /*  number of iterators currently running  */
} dict;

/*  If safe is set to 1 this is a safe iteartor, that means, you can call
 * dictAdd, dictFind, and other functions against the dictionary even while
 * iterating. Otherwise it is a non safe iterator, and only dictNext()
 * should be called while iterating. 
*/
typedef  struct dictIterator {
    dict *d;
     int table, index, safe;
    dictEntry *entry, *nextEntry;
} dictIterator;

/*  This is the initial size of every hash table  */
#define DICT_HT_INITIAL_SIZE     4

/*  ------------------------------- Macros ------------------------------------ */
#define dictFreeEntryVal(d, entry) \
     if ((d)->type->valDestructor) \
        (d)->type->valDestructor((d)->privdata, (entry)->val)

#define dictSetHashVal(d, entry, _val_) do { \
     if ((d)->type->valDup) \
        entry->val = (d)->type->valDup((d)->privdata, _val_); \
     else \
        entry->val = (_val_); \
while(0)

#define dictFreeEntryKey(d, entry) \
     if ((d)->type->keyDestructor) \
        (d)->type->keyDestructor((d)->privdata, (entry)->key)

#define dictSetHashKey(d, entry, _key_) do { \
     if ((d)->type->keyDup) \
        entry->key = (d)->type->keyDup((d)->privdata, _key_); \
     else \
        entry->key = (_key_); \
while(0)

#define dictCompareHashKeys(d, key1, key2) \
    (((d)->type->keyCompare) ? \
        (d)->type->keyCompare((d)->privdata, key1, key2) : \
        (key1) == (key2))

#define dictHashKey(d, key) (d)->type->hashFunction(key)

#define dictGetEntryKey(he) ((he)->key)
#define dictGetEntryVal(he) ((he)->val)
#define dictSlots(d) ((d)->ht[0].size+(d)->ht[1].size)
#define dictSize(d) ((d)->ht[0].used+(d)->ht[1].used)
#define dictIsRehashing(ht) ((ht)->rehashidx != -1)

/*  API  */
dict *dictCreate(dictType *type,  void *privDataPtr);
#ifdef _WIN32
int dictExpand(dict *d, size_t size);
#else
int dictExpand(dict *d, unsigned  long size);
#endif
int dictAdd(dict *d,  void *key,  void *val);
int dictReplace(dict *d,  void *key,  void *val);
int dictDelete(dict *d,  const  void *key);
int dictDeleteNoFree(dict *d,  const  void *key);
void dictRelease(dict *d);
dictEntry * dictFind(dict *d,  const  void *key);
void *dictFetchValue(dict *d,  const  void *key);
int dictResize(dict *d);
dictIterator *dictGetIterator(dict *d);
dictIterator *dictGetSafeIterator(dict *d);
dictEntry *dictNext(dictIterator *iter);
void dictReleaseIterator(dictIterator *iter);
dictEntry *dictGetRandomKey(dict *d);
void dictPrintStats(dict *d);
unsigned  int dictGenHashFunction( const unsigned  char *buf,  int len);
unsigned  int dictGenCaseHashFunction( const unsigned  char *buf,  int len);
void dictEmpty(dict *d);
void dictEnableResize( void);
void dictDisableResize( void);
int dictRehash(dict *d,  int n);
int dictRehashMilliseconds(dict *d,  int ms);

/*  Hash table types  */
extern dictType dictTypeHeapStringCopyKey;
extern dictType dictTypeHeapStrings;
extern dictType dictTypeHeapStringCopyKeyValue;

你可能感兴趣的:(redis dict)