首先為了區分Redis的鍵值對存儲的key-value,Hash中的鍵值對稱為field-value。
命令
1.Hset
Hset key?field value [field value]
返回值為設置成功的field-value的個數。
2.Hget
Hget key field?
返回為value
3.Hexists
Hexists key field
判斷是否存在:返回1表示存在,0表示不存在。
4.Hdel
Hdel key field [field....]
刪除Hash中指定的字段,返回類型為刪除的字段個數。
注意區分Hdel和del:
Hdel是刪除的field,而del則是將整個Key都刪除。
5.Heys
Hkeys key
獲取Hash中所有的字段,是一個比較危險的操作,類似于Keys*,可能會引起服務器阻塞。
6.Hvals
Hvals key
獲取Hash中所有的values。(也可能有危險,尤其是values特別多時)
7.Hgetall
Hgetall key
獲取Hash中所有的field 和 values(危險操作)
8.HMget
類似于Mget,可以一次查詢多個field 。
語法:HMget key f1,f2....
其次Hash中也有HMset,但是由于Hset已經可以一次設置多個了,所以HMset也沒什么必要了。
上述操作中的Hkeys,Hgetall,Hvals都是具有一定風險的操作,當元素過多時,可能會阻塞服務器,為了避免這種情況,我們可以使用“漸進式”遍歷式操作“scan”,將這些操作“化整為零“。scan操作會在之后文章中介紹。
9.Hlen
Hlen? key
獲取Hash中所有字段的個數。注意時間復雜度為O(1)級別(不用遍歷)
10.Hset? NX
HSETNX key field value
當字段不存在時才能設置成功。
11.HIncrby
對value可以加減整數。
12.HIncrbyFloat
對valuue加減小數。
這兩個操作在操作時,是先將value轉為對應的格式(int,double),處理好后再轉為String格式存進去。
Hash內部編碼
1.ziplist
采用一定的算法對數據進行壓縮操作,讓空間更加緊湊,節省內存空間,代價就是進行讀寫的速度會比較慢,適合于元素個數較少,元素長度較短的情況。
2.HashTable
當元素不適用于ziplist時,就會轉化為HashTable。具體什么時候開始轉化,可以在Redis中的配置文件中來手動配置。
Hash使用場景
主要是通過hash來存Mysql中的表
比如說,可以將key設置為user1,field為name,value為20,這樣就將user的name屬性存好了,也可以設置多個hash,分別存Id,age等。
其次String類型也可以通過設置為Json類型來存數據庫中的數據,但是如果修改的話就不如Hash方便,因為需要將整個Json都取出來再修改。而Hash可以直接通過修改對應field的value來修改。
但是Hash也有缺點,尤其當內部編碼為HashTable時,空間浪費現象比較嚴重。主要原因為以下幾點:
- 指針開銷:HashTable 中的每個鍵值對都需要額外的指針來鏈接
- 內存對齊:HashTable 中的節點需要按照一定的字節邊界對齊,導致內存碎片
- 哈希表結構開銷:HashTable 需要維護哈希桶、鏈表等結構
- 空間預分配:為了避免頻繁擴容,Redis 會預分配更多的空間