1.hash常用操作?
? ? ? 這里還是要強調,redis的類型指的是value的類型。故而這里的hash是把key這一層組織完成以后,到了value這一層,value的其中一種類型還可以是hash。
1.1 HSET 和 HGET
????????HSET:設置hash類型的key
HSET key field value [field value ...]
? ? ? ? 返回值是設置成功的鍵值對(field-value)的個數
????????HGET:獲取對應key中對應field的值
HGET key field
? ? ? ? 返回值為查詢key中對應的field對應的value,如果不存在則返回nil
1.2 HDEL
????????HDEL:刪除hash中指定的字段
? ? ? ? 注意:del刪除的key而hdel刪除的field
HDEL key field [field ...]
? ? ? ? 返回值為本次操作刪除的字段個數
1.3 HKEYS
? ? ? ? HKEYS:這個操作,先根據key找到對應的value(hash),然后再遍歷value
HKEYS key
? ? ? ? 返回值就是這個key中所有的field? ? ? ??
? ? ? ? 我上面這個操作存在一定的風險,就類似于之前的keys * ,如果key中的hash存在大量的field就有可能讓我們的redis阻塞住。
1.4 HVALS
? ? ? ? HVALS:和hkeys相對能夠獲取到hash中的所有value
HVALS key
? ? ? ? 返回值就是對應key中的所有field對應的值
1.5 HGETALL?
? ? ? ? HGETALL:查詢value中的所有數據
HGETALL key
? ? ? ? 返回值就是value中的所有數據包括field和value
????????
? ? ? ? 其實上面這樣的操作風險還是有億點大的,多數情況下,不需要查詢所有的field,可能只需要查其中的幾個field
1.6 HLEN
? ? ? ? HLEN:獲取hash的元素個數,不需要遍歷
HLEN key
? ? ? ? 返回值就是hash的長度
1.7 HSETNX
? ? ? ? HSETNX:類似于setnx。不存在的時候,才能設置成功,如果存在則失敗。
HSETNX key field value
????????
1.8 常用操作小結
命令 | 執行效果 | 時間復雜度 |
hset key field value | 設置值 | O(1) |
hget key field | 獲取值 | O(1) |
hdel key field [field ...] | 刪除field | O(k) |
hlen key | 計算field個數 | O(1) |
hgetall key | 獲取所有的field-value | O(k) |
hmget field [field ...] | 批量獲取field-value | O(k) |
hmset field value [field value ...] | 批量設置field-value | O(k) |
hexists key field | 判斷field是否存在 | O(1) |
hkeys key | 獲取所有的field | O(k) |
hvals key | 獲取所有的value | O(k) |
hsetnx key field value | 設置值,但必須再field不存在時才能設置成功 | O(1) |
hincrbykey field n | 對應field-value + n | O(1) |
hincrbyfloat key field n | 對應field-value + n | O(1) |
hstrlen key field | 計算value的字符串長度 | O(1) |
2.redis中的hash的內部編碼
? ? ? ? rar、zip、gzip、7z...這些是具體的壓縮算法
? ? ? ? 壓縮的本質是針對數據進行重新編碼。不同的數據,有不同的特點,結合這些特點,進行精妙的設計,重新編碼之后,就能縮小體積。類似的例子如下
2.2 ziplist
? ? ? ? ziplist存在的目的就是節省空間,ziplist內部的數據結構是精心設計的
? ? ? ? 使用hash來表示一個普通的hash表,可能會浪費一定的空間(hash首先是一個數組,數組上有些位置有元素,有些沒有)
????????
3.redis中的hash的應用