Redis資料型別及使用場景

2021-07-26 17:11:09 字數 3478 閱讀 4297

wqtech閱讀:

2936

摘要:redis相比其它的kv資料庫,其一大特點是支援豐富的資料型別.它一共支援5種資料型別,下面逐一介紹這5種資料型別及其使用場景...

 redis相比其它的kv資料庫,其一大特點是支援豐富的資料型別。它一共支援5種資料型別,下面逐一介紹這5種資料型別及其使用場景和內部實現方式。

string

簡介:strings資料型別是最常用、簡單的key-value型別,普通的key/ value 儲存都可以歸為此類。value不僅可以是字串,也可以是數字。因為是二進位制安全的,所以你完全可以把乙個檔案的內容作為string來儲存。redis的string可以完全實現目前memcached的功能,並且效率更高。除了提供與 memcached 一樣的get、set、incr、decr 等操作外,redis還額外提供了下面一些操作:

常用命令: set,get,decr,incr,mget 等。

應用場景:

實現方式:string在redis內部儲存預設就是乙個字串,被redisobject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisobject的encoding欄位為int。

hash簡介:hash存的是字串和字串值之間的對映。hash將物件的各個屬性存入map裡,可以只讀取/更新物件的某些屬性。這樣有些屬性超長就讓它一邊呆著不動,另外不同的模組可以只更新自己關心的屬性而不會互相併發導致覆蓋衝突。

常用命令:hget,hset,hgetall 等。

應用場景:

key是使用者id, value是乙個map,這個map的key是成員的屬性名,value是屬性值,這樣對資料的修改和訪問都可以直接通過其內部map的key(redis裡稱內部map的key為field), 也就是通過key(使用者id) + field(屬性標籤) 就可以操作對應屬性資料了,既不需要重複儲存資料,也不會帶來序列化和併發修改控制的問題。

不過這裡需要注意,redis提供了介面(hgetall)可以直接取到全部的屬性資料,但是如果內部map的成員很多,那麼涉及到遍歷整個內部map的操作,由於redis單執行緒模型的緣故,這個遍歷操作可能會比較耗時,而對其它客戶端的請求完全不響應,這點需要格外注意。

實現方式:

redis hash對應value內部實際就是乙個hashmap,這裡會有2種不同實現,這個hash的成員比較少時redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的hashmap結構,對應的value redisobject的encoding為zipmap,當成員數量增大時會自動轉成真正的hashmap,此時encoding為ht。

list簡介:list是乙個雙向鍊錶,支援雙向的pop/push,江湖規矩一般從左端push,右端pop——lpush/rpop,而且還有blocking的版本blpop/brpop,客戶端可以阻塞在那直到有訊息到來。還有rpoplpush/ brpoplpush,彈出來返回給client的同時,把自己又推入另乙個list,llen獲取列表的長度。還有按值進行的操作:lrem(按值刪除元素)、linsert(插在某個值的元素的前後),複雜度是o(n),n是list長度,因為list的值不唯一,所以要遍歷全部元素,而set只要o(log(n))。

按下標進行的操作:下標從0開始,佇列從左到右算,下標為負數時則從右到左。lset ,按下標設定元素值。lindex,按下標返回元素。lrange,不同於pop直接彈走元素,只是返回列表內一段下標的元素,是分頁的最愛。ltrim,限制list的大小,比如只保留最新的20條訊息。複雜度也是o(n),其中lset的n是list長度,lindex的n是下標的值,lrange的n是start的值+列出元素的個數,因為是鍊錶而不是陣列,所以按下標訪問其實要遍歷鍊錶,除非下標正好是隊頭和隊尾。ltrim的n是移除元素的個數。

常用命令:lpush,rpush,lpop,rpop,lrange等。

應用場景:

訊息佇列,可以利用lists的push操作,將任務存在lists中,然後工作執行緒再用pop操作將任務取出執行。這裡的訊息佇列並沒有ack機制,如果消費者把任務給pop走了又沒處理完就宕機了怎麼辦?解決方法之一是加多乙個sorted set,分發的時候同時發到list與sorted set,以分發時間為score,使用者把任務做完了之後要用zrem消掉sorted set裡的job,並且定時從sorted set中取出超時沒有完成的任務,重新放回list。另乙個做法是為每個worker多加乙個的list,彈出任務時改用rpoplpush,將job同時放到worker自己的list中,完成時用lrem消掉。如果集群管理(如zookeeper)發現worker已經掛掉,就將worker的list內容重新放回主list。

利用lrange可以很方便的實現list內容分頁的功能。

取最新n個資料的操作:lpush用來插入乙個內容id,作為關鍵字儲存在列表頭部。ltrim用來限制列表中的專案數最多為5000。如果使用者需要的檢索的資料量超越這個快取容量,這時才需要把請求傳送到資料庫。

實現方式:

redis list的實現為乙個雙向鍊錶,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,redis內部的很多實現,包括傳送緩衝佇列等也都是用的這個資料結構。

set簡介:是一種無序的集合,集合中的元素沒有先後順序,不重複。將重複的元素放入set會自動去重。

常用命令:

sadd,spop,smembers,sunion等。

應用場景:

實現方式:

set 的內部實現是乙個 value永遠為null的hashmap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷乙個成員是否在集合內的原因。

sorted set簡介:有序集合,相比set,元素放入集合時還要提供該元素的分數,可根據分數自動排序。

常用命令:

zadd,zrange,zrem,zcard等

使用場景:

實現方式:

redis sorted set的內部使用hashmap和跳躍表(skiplist)來保證資料的儲存和有序,hashmap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是hashmap裡存的score,使用跳躍表的結構可以獲得比較高的查詢效率,並且在實現上比較簡單。

Redis資料型別及使用場景

redis支援常見的資料型別,現在是被廣泛用在各大公司的內部,它可以做的東西很多,不過要先了解下他提供的基本資料型別與常見操作。接下來一起看看把。最基礎的資料型別,首先key是字串型別,其它的資料型別都是在字串的基礎之上構建的。set命令 批量設定和獲取命令,在操作多個key的時候可以節省網路傳輸時...

Redis資料型別及使用場景

redis 除了這 5 種資料型別之外,還有 bitmaps hyperloglogs streams 等。這是最簡單的型別,就是普通的 set 和 get,做簡單的 kv 快取。set college szu 複製 這個是類似 map 的一種結構,這個一般就是可以將結構化的資料,比如乙個物件 前提...

Redis的資料型別及使用場景

儲存的時候key和value都是string,value支援string hash list set zset等資料結構。redis內部的key value通過乙個redisobject物件來儲存,type表示value的型別 string等 encoding表示儲存方式 raw int等 結構 k...