redis資料結構之雜湊

2021-09-29 11:05:02 字數 4159 閱讀 4394

請看官方文件: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...