請看官方文件:redis中文官方文件
雜湊表redis的hash實際是內部儲存的value為乙個hashmap,並提供了直接訪問這個map成員的介面,也就是說,key仍然是使用者id, value是乙個map,這個map的key是成員的屬性名,value是屬性值,這樣對資料的修改和訪問都可以直接通過其內部map的key(redis裡稱內部map的key為field), 也就是通過 key(使用者id) + field(屬性標籤) 就可以操作對應屬性資料了,既不需要重複儲存資料,也不會帶來序列化和併發修改控制的問題。很好的解決了問題。
這裡同時需要注意,redis提供了介面(hgetall)可以直接取到全部的屬性資料,但是如果內部map的成員很多,那麼涉及到遍歷整個內部map的操作,由於redis單執行緒模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意。
實現方式:(2種不同實現)
hash的成員比較少時redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的hashmap結構,對應的value redisobject的encoding為zipmap,大家對陣列應該比較了解,陣列是通過索引快速定位到指定元素的,無論是訪問陣列的第乙個元素還是最後乙個元素,所耗費的時間都是一樣的,但是陣列中的索引卻沒有實際意義,他只是乙個位置而已。而我們在查詢某個元素時,一般都會使用有意義的字段來做索引,這就產生啦dictionary。其實dictionary的實現,就是讓key跟下標索引有一定的關係,所實現的,讓他的查詢演算法複雜度變為常數o(1);
當成員數量增大時會自動轉成真正的hashmap,此時encoding為ht。
總結:常見命令
hset
語法:hset hash field value
介紹:如果給定的雜湊表並不存在, 那麼乙個新的雜湊表將被建立並執行hset
操作。
如果域field
已經存在於雜湊表中, 那麼它的舊值將被新值value
覆蓋。
返回值:
當hset
命令在雜湊表中新建立field
域並成功為它設定值時, 命令返回1
;
如果域field
已經存在於雜湊表, 並且hset
命令成功使用新值覆蓋了它的舊值, 那麼命令返回0
hsetnx
語法:hsetnx hash field value
介紹:當且僅當域field
尚未存在於雜湊表的情況下, 將它的值設定為value
。
如果給定域已經存在於雜湊表當中, 那麼命令將放棄執行設定操作。
如果雜湊表hash
不存在, 那麼乙個新的雜湊表將被建立並執行hsetnx
命令。
返回值:hsetnx
命令在設定成功時返回1
, 在給定域已經存在而放棄執行設定操作時返回0
。
hget
語法:hget hash field
介紹:返回雜湊表中給定域的值。
返回值:
hget
命令在預設情況下返回給定域的值。
如果給定域不存在於雜湊表中, 又或者給定的雜湊表並不存在, 那麼命令返回nil
。
hexisis
語法:hexisis hash field value
介紹:檢查給定域field
是否存在於雜湊表hash
當中。
返回值:hexists
命令在給定域存在時返回1
, 在給定域不存在時返回0
。
hdel
語法:hdel key field [field …]
介紹:刪除雜湊表key
中的乙個或多個指定域,不存在的域將被忽略。
**返回值:**被成功移除的域的數量,不包括被忽略的域。
hlen
語法:hlen key
介紹:返回雜湊表key
中域的數量。
**返回值:**雜湊表中域的數量,當key
不存在時,返回0
。
hstrlen
語法:hstrlen key filed
介紹:返回雜湊表key
中, 與給定域field
相關聯的值的字串長度(string length),如果給定的鍵或者域不存在, 那麼命令返回0
。
**返回值:**乙個整數
hincrby
語法:hincrby key filed increment
介紹:為雜湊表key
中的域field
的值加上增量increment
,增量也可以為負數,相當於對給定域進行減法操作。如果key
不存在,乙個新的雜湊表被建立並執行 hincrby 命令,如果域field
不存在,那麼在執行命令前,域的值被初始化為0
。對乙個儲存字串值的域field
執行 hincrby 命令將造成乙個錯誤,本操作的值被限制在 64 位(bit)有符號數字表示之內。
**返回值:**雜湊表key
中域field
的值。
hincrbyfloat
語法:hincrbyfloat key field increment
介紹:為雜湊表key
中的域field
加上浮點數增量increment
。如果雜湊表中沒有域field
,那麼 hincrbyfloat 會先將域field
的值設為0
,然後再執行加法操作。如果鍵key
不存在,那麼 hincrbyfloat 會先建立乙個雜湊表,再建立域field
,最後再執行加法操作。
**返回值:**執行加法操作之後field
域的值。
hmset
語法:hmset key field value [field value …]
介紹:同時將多個field-value
(域-值)對設定到雜湊表key
中。此命令會覆蓋雜湊表中已存在的域。如果key
不存在,乙個空雜湊表被建立並執行 hmset 操作。
**返回值:**如果命令執行成功,返回ok
。當key
不是雜湊表(hash)型別時,返回乙個錯誤。
hmget
語法:hmget key field [field …]
介紹:返回雜湊表key
中,乙個或多個給定域的值。如果給定的域不存在於雜湊表,那麼返回乙個nil
值。因為不存在的key
被當作乙個空雜湊表來處理,所以對乙個不存在的key
進行 hmget 操作將返回乙個只帶有nil
值的表。
**返回值:**乙個包含多個給定域的關聯值的表,錶值的排列順序和給定域引數的請求順序一樣。
hkeys
語法:hkeys key
介紹:返回雜湊表key
中的所有域。
**返回值:**乙個包含雜湊表中所有域的表。當key
不存在時,返回乙個空表。
hvals
語法:hvals key
介紹:返回雜湊表key
中所有域的值。
**返回值:**乙個包含雜湊表中所有值的表。當key
不存在時,返回乙個空表。
hgetall
語法:hgetall key
介紹:返回雜湊表key
中,所有的域和值。在返回值裡,緊跟每個網域名稱(field name)之後是域的值(value),所以返回值的長度是雜湊表大小的兩倍。
**返回值:**以列表形式返回雜湊表的域和域的值。若key
不存在,返回空列表。
Redis資料結構之雜湊hash
雜湊型別 hash 用於儲存鍵值對結構的資料,值只能是字串 hset 新增資料,返回1或0 hset key field value127.0.0.1 6379 hset user 1 name redis integer 1hmset 批量新增資料 hmset key field1 value1 ...
資料結構之雜湊
題目1 實現乙個簡單的雜湊結構 使用youlookdeliciousc的做法,即用拉鍊表來實現。技巧是vector來做為容器 struct node int len 1000 class myhashmap void put int key,int value pre cur cur cur nex...
資料結構之雜湊例程
int hash const string key,int tableszie int hash const string key,int tablesize a hash routine for string objects.int hash const string key,int tables...