說說你所用過的Redis資料型別

2021-10-02 18:59:53 字數 2213 閱讀 5391

string是簡單的 key-value 鍵值對,value 不僅可以是 string,也可以是數字。string在redis內部儲存預設就是乙個字串,被redisobject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisobject的encoding欄位為int。

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

應用場景

string是最常用的一種資料型別,普通的key/value儲存都可以歸為此類,這裡就不所做解釋了。

redis列表是簡單的字串列表,可以模擬到c++中的std::list,簡單的說就是乙個鍊錶或者說是乙個佇列。可以從頭部或尾部向redis列表新增元素。列表的最大長度為2^32 - 1,也即每個列表支援超過40億個元素。

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

應用場景

redis list的應用場景非常多,也是redis最重要的資料結構之一,比如twitter的關注列表、粉絲列表等都可以用redis的list結構來實現,再比如有的應用使用redis的list型別實現乙個簡單的輕量級訊息佇列,生產者push,消費者pop/bpop。

類似c#中的dict型別或者c++中的hash_map型別。

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

應用場景

假設有多個使用者及對應的使用者資訊,可以用來儲存以使用者id為key,將使用者資訊序列化為比如json格式做為value進行儲存。

可以理解為一堆值不重複的列表,類似數學領域中的集合概念,且redis也提供了針對集合的求交集、並集、差集等操作。

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

應用場景

redis set對外提供的功能與list類似是乙個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存乙個列表資料,又不希望出現重複資料時,set是乙個很好的選擇,並且set提供了判斷某個成員是否在乙個set集合內的重要介面,這個也是list所不能提供的。

又或者在微博應用中,每個使用者關注的人存在乙個集合中,就很容易實現求兩個人的共同好友功能。

5. sorted set(有序集合)

redis有序集合類似redis集合,不同的是增加了乙個功能,即集合是有序的。乙個有序集合的每個成員帶有分數,用於進行排序。

redis有序集合新增、刪除和測試的時間複雜度均為o(1)(固定時間,無論裡面包含的元素集合的數量)。列表的最大長度為2^32- 1元素(4294967295,超過40億每個元素的集合)。

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

使用場景

redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供乙個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要乙個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。

你能說說你理解的資料庫規範嗎?

1 首先是工具,我們用的是 mysql資料庫,工具是workbench,這個工具是專門為mysql設計的資料庫建模工具,你可以用它進行設計和建立新的資料庫圖示,在windows上面我們大多用的是powerdesiger,在mac上用workbench目前來看還是挺好用的,無論是建立資料庫文件,er圖...

使用過Redis做非同步佇列麼,你是怎麼用的?

一般使用list結構作為佇列,rpush生產訊息,lpop消費訊息。當lpop沒有訊息的時候,要適當sleep一會再重試。如果對方追問可不可以不用sleep呢?list還有個指令叫blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。如果對方追問能不能生產一次消費多次呢?使用pub sub主題訂閱者...

使用過 Redis 做非同步佇列麼,你是怎麼用的?

一般使用 list 結構作為佇列,rpush 生產訊息,lpop 消費訊息。當 lpop 沒有 訊息的時候,要適當 sleep 一會再重試。如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。如果對 方追問能不能生產一次消費多次呢?...