亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

redis哈希類型_動力節點Java學院整理

2020-03-17 12:37:17
字體:
來源:轉載
供稿:網友

redis/46285.html">redis中的hash也是我們使用中的高頻數據結構,它的構造基本上和編程語言中的HashTable,Dictionary大同小異,如果大家往后有什么邏輯需要用Dictionary存放的話,可以根據場景優先考慮下redis哦。

一:常用方法

  只要是一個數據結構,最基礎的永遠是CURD,redis中的insert和update,永遠只需要set來替代,比如下面的Hset,如下圖:

redis,哈希表,哈希

就好像Java中的類和方法,知道傳遞一些啥參數就OK了,就比如要說的HSet,它的格式如下:

redis,哈希表,哈希

接下來我在CentOS里面操作一下,

[administrator@localhost redis-3.0.5]$ src/redis-cli.0.0.1:6379> clear.0.0.1:6379> hset person name jack(integer) 1.0.0.1:6379> hset person age 20(integer) 1.0.0.1:6379> hset person sex famale(integer) 1.0.0.1:6379> hgetall person) "name") "jack") "age") "20") "sex") "famale".0.0.1:6379> hkeys person) "name") "age") "sex".0.0.1:6379> hvals person) "jack") "20") "famale".0.0.1:6379>

或許有人看了上面的console有一點疑惑,那就是前面有幾個參數,比如person,name啦,然后才是value,其實在redis的這個層面,它永遠只有一個鍵,一個值,這個鍵永遠都是字符串對象,也就是SDS對象,而值的種類就多了,有字符串對象,有隊列對象,還有這篇的hash對象,往后的有序集合對象等等,如果你還不明白的話,轉化為Java語言就是。

 Map<String,String> person=new HashMap<string,string>(); person.Add("name","jack"); ....

調用方法就是這么的簡單,關鍵在于時不時的需要你看一看手冊,其實最重要的是了解下它在redis源碼中的原理就好了。

二:探索原理

  hash的源代碼是在dict.h源代碼里面,枚舉如下:

typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; double d; } v; 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 0. */typedef struct dictht { dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used;} dictht;typedef struct dict { dictType *type; void *privdata; dictht ht[2]; long 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 iterator, 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; long index; int table, safe; dictEntry *entry, *nextEntry; /* unsafe iterator fingerprint for misuse detection. */ long long fingerprint;} dictIterator;

上面就是我們使用hash的源代碼數據結構,接下來我來擼一擼其中的邏輯關系。

 dict結構

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

這個結構是hash的真正的底層數據結構,可以看到其中有5個屬性。 

<1> dictType *type

   可以看到它的類型是dictType,從上面你也可以看到,它是有枚舉結構定義的,如下:

 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;

從上面這個數據結構中你可以看到里面都是一些方法,但是有一個非常重要的方法,那就是第一個hashFunction,可以看到它就是計算hash值的,跟Java中的求hash值差不多。 

<2> dictht ht[2]

       你可能會疑問,為什么這個屬性是2個大小的數組呢,其實正真使用的是ht[0],而ht[1]是用于擴容hash表時的暫存數組,這一點也很奇葩,同時也很精妙,redis為什么會這么做呢???仔細想想你可能會明白,擴容有兩種方法,要么一次性擴容,要么漸進性擴容,后面這種擴容是什么意思呢?就是我在擴容的同時不影響前端的CURD,我慢慢的把數據從ht[0]轉移到ht[1]中,同時rehashindex來記錄轉移的情況,當全部轉移完成之后,將ht[1]改成ht[0]使用,就這么簡單。 

 dicth結構

 typedef struct dictht {dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used; } dictht;

<1> dictEntry **table;

       從上面這個結構體中,你可以看到一個非常重要的屬性: dictEntry **table, 其中table是一個數組,數組類型是dictEntry,既然是一個數組,那后面的三個屬性就好理解了,size是數組的大小,sizemask和數組求模有關,used記錄數組中已使用的大小,現在我們把注意力放在dictEntry這個數組實體類型上面。 

dictEntry結構

 typedef struct dictEntry { void *key; union {  void *val;  uint64_t u64; int64_t s64;  double d; } v; struct dictEntry *next; } dictEntry;

從這個數據結構上面你可以看到有三個大屬性。

第一個就是:   *key:它就是hash表中的key。

第二個就是:    union的*val 就是hash的value。

第三個就是:    *next就是為了防止hash沖突采用的掛鏈手段。 

如果總結上面描述的話,我可以畫出如下的hash結構圖。

redis,哈希表,哈希

 


注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品久久久久| 中日韩午夜理伦电影免费| 日韩av影视综合网| 国产精品老女人视频| 色偷偷偷亚洲综合网另类| 亚洲天堂男人的天堂| 亚洲人成欧美中文字幕| 日韩成人小视频| 欧美亚州一区二区三区| 亚洲第一福利网站| 国产精品xxx视频| 91极品视频在线| 亚洲人成77777在线观看网| 亚洲色图日韩av| 久久琪琪电影院| 91影视免费在线观看| 97热精品视频官网| 国产成人在线一区| 欧美日韩一区免费| 免费97视频在线精品国自产拍| 久久五月天综合| 精品日韩视频在线观看| 久久精品2019中文字幕| 亚洲香蕉av在线一区二区三区| 亚洲国产精品999| 国产+成+人+亚洲欧洲| 精品av在线播放| 成人在线精品视频| 中文字幕av一区中文字幕天堂| 欧美日韩福利视频| 精品一区二区亚洲| 最新亚洲国产精品| 欧美综合一区第一页| 国产亚洲精品日韩| 亚洲精品xxx| 日韩av中文字幕在线| 亚洲国产成人爱av在线播放| 亚洲成人激情图| 视频在线观看99| 欧美成人精品在线| 欧洲成人免费aa| 国产精品久久久久久久午夜| 亚洲精品永久免费| 国产激情综合五月久久| 国产精品一区久久久| 欧美人与物videos| 亚洲欧美在线x视频| 国产69久久精品成人看| 欧美午夜精品久久久久久浪潮| 欧美电影免费观看高清| 福利一区福利二区微拍刺激| 国产精品国产三级国产aⅴ9色| 美乳少妇欧美精品| 亚洲精品永久免费| 欧美国产日产韩国视频| 欧美视频精品一区| 国产欧美在线观看| 亚洲欧美精品伊人久久| 亚洲成人教育av| 日韩经典一区二区三区| 欧美综合激情网| 国产精品a久久久久久| 精品国产福利视频| 成人国产在线激情| 国产精品夜色7777狼人| 疯狂欧美牲乱大交777| 国产综合视频在线观看| 国产专区欧美专区| 国产精欧美一区二区三区| 欧美亚洲一级片| 国产亚洲欧洲高清一区| 欧美亚洲视频在线看网址| 亚洲成人久久一区| 国产日韩欧美在线看| 日韩精品在线免费| 日韩中文字幕久久| 欧美精品久久久久a| 亚洲中国色老太| 久久97精品久久久久久久不卡| 色偷偷av一区二区三区| 日韩天堂在线视频| 91国内在线视频| 最近2019中文免费高清视频观看www99| 成人av色在线观看| 搡老女人一区二区三区视频tv| 亚洲免费福利视频| 国产91九色视频| 98精品国产自产在线观看| 91精品久久久久久久久中文字幕| 欧美性猛交xxxx| 国产成人亚洲综合青青| 欧美高清视频在线观看| 欧美激情免费在线| 视频在线观看99| 91夜夜揉人人捏人人添红杏| 久久九九热免费视频| 国产91精品久久久久久| 久久久999精品| 欧美一级淫片aaaaaaa视频| 亚洲激情视频网站| 青青在线视频一区二区三区| 亚洲成人av片| 国产精品自产拍高潮在线观看| 欧美精品www在线观看| 久久精品久久久久久| 日韩成人性视频| 久久精品2019中文字幕| 国产欧美一区二区三区在线| 久久久精品网站| 欧美视频在线观看 亚洲欧| 国产精品99蜜臀久久不卡二区| 亚洲电影免费观看| 国产精品久久在线观看| 国产成人aa精品一区在线播放| 亚洲精品资源美女情侣酒店| 91国内在线视频| 亚洲欧美一区二区三区在线| 欧美高清性猛交| 亚洲国产97在线精品一区| 欧美精品videossex88| 国产91精品不卡视频| 国产精品激情av在线播放| 中文字幕国产日韩| 久久成人人人人精品欧| 色噜噜久久综合伊人一本| 国产精品网红直播| 亚洲国产天堂久久综合网| 欧美视频一区二区三区…| 日韩欧美视频一区二区三区| 欧美大片网站在线观看| 欧美美最猛性xxxxxx| 大荫蒂欧美视频另类xxxx| 欧美性猛交丰臀xxxxx网站| 日韩欧美国产一区二区| 欧美性高潮在线| 中文字幕成人在线| 色播久久人人爽人人爽人人片视av| 日本人成精品视频在线| 国产精品三级久久久久久电影| 精品视频偷偷看在线观看| 97在线看免费观看视频在线观看| 国产丝袜一区二区三区免费视频| 亚洲国产天堂网精品网站| 日韩精品极品在线观看| 国产极品jizzhd欧美| 成人春色激情网| 成人性教育视频在线观看| 国产精品情侣自拍| 精品国产一区二区三区久久久| 午夜精品视频在线| 欧美激情一级欧美精品| 清纯唯美亚洲综合| 91av中文字幕| 中文字幕综合在线| 日韩免费精品视频| 欧美激情在线狂野欧美精品| 亚洲欧美在线x视频| 欧美在线观看www| 精品久久久久久| 日本a级片电影一区二区| 日韩美女免费观看| 日本中文字幕不卡免费| 久久韩国免费视频| 欧美重口另类videos人妖|