Redis(四) 數據類型hash

作者:畢濤濤,致力于Java學習的踐行者。原創(chuàng)文章,轉載請注明出處。

hash(字典)

Redis的字典相當于Java語言的HashMap。它是無序字典。內部實現結構上同Java的HashMap也是一致的,同樣的數組 + 鏈表二維結構。第一維 hash 的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。

hash結構.png
不同的是,Redis的字典的值只能是字符串,另外它們的方式不一樣,因為Java的HashMap在字典很大時,是個耗時的操作,需要一次性全部rehash。Redis為了高性能,不能堵塞服務,所以采用了漸進式rehash策略。

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

rehash過程.png

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

hash也有缺點,hash結構的存儲消耗要高于單個字符串,到底該使用hash還是字符串,需要根據實際情況再三權衡。
hash命令.png
  1. hset myhash field1 value1 (含義是hset是hash集合,myhash是集合名字,field1是字段名,value1為其值)。
  2. 使用hget myhash field1 獲取內容。
  3. hmset可以進行批量獲取多個鍵值對。
  4. hincrby和hdecrby集合遞增和遞減。
  5. hexists是否存在key 如果存在返回,不存在返回0。
  6. hlen返回hash集合里的所有的鍵數值
  7. hdel刪除指定hash的field
  8. hkeys返回hash里所有的字段
  9. hvals返回hash的所有value
  10. hgetall 返回hash里所有的key和value
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Redis 是一個鍵值對數據庫(key-value DB),數據庫的值可以是字符串、集合、列表等多種類型的對象,而...
    吳昂_ff2d閱讀 3,742評論 0 5
  • 1 前言 Redis的5種數據類型(String,Hash,List,Set,Sorted Set),每種數據類型...
    LZhan閱讀 436評論 0 2
  • 首先,來介紹一個概念就是“回報感”。在這里將之定義為,動作發(fā)出者要求承受者進行動作償還的一種心理傾向。通俗來講,就...
    文雨山閱讀 540評論 0 0
  • 這兩天培訓家庭財務規(guī)劃,清楚明白的算清楚了自己的財務狀況,對自己的情況有了一個清晰的認知和未來明顯的判斷,頓時也心...
    super貝貝閱讀 126評論 0 0
  • 七月份確實比其他月份要熱鬧一些。因為畢業(yè)生就業(yè)工作,在校師生放暑假都在每年這個月定期發(fā)生。 今年七月我既不是在校生...
    秦簡希閱讀 738評論 0 0

友情鏈接更多精彩內容