作者:畢濤濤,致力于Java學習的踐行者。原創(chuàng)文章,轉載請注明出處。
hash(字典)
Redis的字典相當于Java語言的HashMap。它是無序字典。內部實現結構上同Java的HashMap也是一致的,同樣的數組 + 鏈表二維結構。第一維 hash 的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。

hash結構.png
HashMap的resize(rehash):
當HashMap中的元素越來越多的時候,hash沖突的幾率也就越來越高,因為數組的長度是固定的。所以為了提高查詢的效率,就要對HashMap的數組進行擴容,數組擴容這個操作也會出現在ArrayList中,這是一個常用的操作,而在HashMap數組擴容之后,最消耗性能的點就出現了:原數組中的數據必須重新計算其在新數組中的位置,并放進去,這就是resize。

rehash過程.png
漸進式rehash會在rehash的同時,保留新舊兩個hash結構,查詢時會同時查詢兩個hash結構,然后在后續(xù)的定時任務中以及hash的子指令中,循序漸進地將舊hash的內容一點帶你遷移到新的hash結構中。
當hash移除了最后一個元素后,該數據結構自動被刪除,內存被回收。
hash結構也可以用來存儲用戶信息,不同于字符串一次性需要全部序列化整個對象,hash可以對用戶結構中的每個字段單獨存儲。這樣當我們需要獲取用戶信息時可以進行部門獲取。而以整個字符串的形式去保存用戶信息的話就只能一次性全部讀取,這樣會比較浪費網絡流量。

hash命令.png
- hset myhash field1 value1 (含義是hset是hash集合,myhash是集合名字,field1是字段名,value1為其值)。
- 使用hget myhash field1 獲取內容。
- hmset可以進行批量獲取多個鍵值對。
- hincrby和hdecrby集合遞增和遞減。
- hexists是否存在key 如果存在返回,不存在返回0。
- hlen返回hash集合里的所有的鍵數值
- hdel刪除指定hash的field
- hkeys返回hash里所有的字段
- hvals返回hash的所有value
- hgetall 返回hash里所有的key和value