一、簡單描述3d
hash是一個string類型的field和value的映射表。添加和刪除操做都是O(1)(平均)的複雜度。hash類型特別適合用於存儲對象。在field的數量在限制的範圍內以及value的長度小於指定的字節數,那麼此時的hash類型是用zipmap存儲的,因此會比較節省內存。能夠在配置文件裏面修改配置項來控制field的數量和value的字節數大小。對象
hash-max-zipmap-entries 512 #配置字段最多512個blog
hash-max-zipmap-value 64 #配置value最大爲64字節。ip
必須知足以上兩個條件,那麼該key會被壓縮。不然就是按照正常的hash結構來存儲hash類型的key。內存
【注意】這兩個配置並非限制hash結構最多隻能存多少個field以及value的最大字節數,而是說在field未超過配置的數量,並且每個filed對應的value的長度都小於指定的字節數時,注意是兩個條件都知足時,該key的存儲是採用的zipmap,就是壓縮了的數據,節省空間。當field的數量超過了,或者其中有value的長度大於指定的長度,那麼整個key就會採用正常的hash結構來在內存中存儲。get
二、相關命令(基於4.0.1版本)string
1)hset命令:設置一個key的filed對應的值,filed不存在則新增,field存在則修改field對應的值。hash
2)hgetall命令:獲取該key的全部field以及對應的值。配置
3)hlen命令:獲取key的長度,就是field的個數。file
4)hvals命令:獲取全部filed對應的value,只返回value。
5)hkeys命令:獲取全部的filed,只返回filed,不返回value。
6)hmset命令:一次設置多個filed和對應的值
7)hmget命令:獲取多個filed的值
8)hdel命令:刪除filed,容許刪除多個。
9)hincrby命令:給filed字段的值增長一個數,能夠是負數。
【注意】不能增長浮點數
10)hexists命令:判斷某個field是否存在,存在則返回1,不然返回0。
三、小結
1)hash結構是能夠壓縮的,要同時知足2個條件,也就是兩個配置項;
2)根據需求來肯定數據是採用string類型來存儲(好比把對象序列化爲string類型),仍是說使用hash存儲(把對象的屬性化爲field和value來存儲),若是是field比較少的,並且value也比較小,那麼用hash節省內存。可是也要考慮具體的需求,若是採用hash,同時要更新幾個field時會不會麻煩些,若是採用string類型,直接修改整個對象而後直接序列化。
固然hash也支持直接把對象序列化來存儲。具體問題具體分析。