# Hash

### 資料結構

Redis中的**Hash**資料結構是一種包含**兩層鍵值對**的散列鍵。可以視為一個hash-key對應的內容包含多組(sub-key : value)鍵值對資料，其中一個sub-key(或稱field)又只會對應一個value。

![Concept of Hash structure in Redis](https://224613336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mb64kSCne8LKJiDOD49%2F-McmteOoiFYVjlRHbp0y%2F-McmvT1k0ne_Lij-iWAt%2Fhash.001.jpeg.001.jpeg?alt=media\&token=dcb64ea2-4cc1-4320-85be-ce2dc13a9d5e)

如果每筆資料內容包含多個欄位，每個欄位又只有一個值，就可以試圖套用Hash來儲存資料。以下方資料框架(Data Frame)格式的資料表為例：

| ID  | Name   | Gender | Age | Hobby      |
| --- | ------ | ------ | --- | ---------- |
| 001 | Mike   | M      | 18  | movies     |
| 002 | Ranger | M      | 19  | motorcycle |
| 003 | Ingrid | F      | 17  | music      |

如果用String的資料結構，一筆資料列可能就必須設置成四組String資料，之後在搜尋資料時，必須自己記得欄位有哪些，並且透過四次取值，才能重新獲得一筆完整的原始資料，如果能夠再多一個sub-key儲存欄位的資訊，資料的架構會清楚許多。

| String Key    | Value  |
| ------------- | ------ |
| ID:001:Name   | Mike   |
| ID:001:Gender | M      |
| ID:001:Age    | 18     |
| ID:001:Hobby  | movies |

因此，針對上述情形，可以嘗試創建Hash資料，針對第一筆資料列，其**Hash-key**可命名&#x70BA;**`ID:001`，Sub-Key**則對應欄位名稱(因此有時改稱Sub-Key為Field)，如下表所示。

| **Sub-Key** | **Value** |
| ----------- | --------- |
| Name        | Mike      |
| Gender      | M         |
| Age         | 18        |
| Hobby       | movies    |

然而上述僅提供一個範例，實際Hash的應用，Hash-Key跟Sub-Key怎麼規劃，應視整體專案的需求來審慎規劃，筆者也在此強調不要侷限於範例的使用情境，建議再透過暸解並熟悉Hash的相關指令(Command)後，再決定適合的資料儲存方式。

![An example of hash structure](https://224613336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mb64kSCne8LKJiDOD49%2F-McmteOoiFYVjlRHbp0y%2F-McmuUhqns2dW6ZiOoPn%2Fhashtable.png?alt=media\&token=8cd4cc16-cf90-4368-a914-dfb218087218)

