1. 程式人生 > 程式設計 >Redis的資料型別及應用場景

Redis的資料型別及應用場景

最近幾年,業界不斷湧現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,在實際應用中做到揚長避短.

1. redis中常用的資料型別

1.1 String型別

Strings 資料結構是簡單的key-value型別,key是字串型別,value可以是String(簡單的字串、複雜的字串(xml、json),也可以是數字(整數、浮點數)、二進位制(圖片、音訊、視訊)),但最大不能超過512M.

常用命令:  set,get,decr,incr,mget 等。
複製程式碼

圖片描述
常用功能: String是最常用的一種資料型別,普通的key/ value 儲存都可以歸為此類.還可以享受Redis的定時持久化。除了提供get、set、incr、decr 等操作外,Redis還提供了下面一些操作:

  • 獲取字串長度
  • 往字串append內容
  • 設定和獲取字串的某一段內容
  • 設定及獲取字串的某一位(bit)
  • 批量設定一系列字串的內容

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

快取功能:字串最經典的使用場景,redis最為快取層,Mysql作為儲存層,絕大部分請求資料都是
         redis中獲取,由於redis具有支撐高併發特性,所以快取通常能起到加速讀寫和降低 後端壓力的作用。
計數器:許多運用都會使用redis作為計數的基礎工具,他可以實現快速計數、查詢快取的功能,
        同時資料可以一步落地到其他的資料來源。
        如:視訊播放數系統就是使用redis作為視訊播放數計數的基礎元件。
共享session:出於負載均衡的考慮,分散式服務會將使用者資訊的訪問均衡到不同伺服器上,
        使用者重新整理一次訪問可能會需要重新登入,為避免這個問題可以用redis將使用者session集中管理,
        在這種模式下只要保證redis的高可用和擴充套件性的,每次獲取使用者更新或查詢登入資訊
        都直接從redis中集中獲取。
限速:處於安全考慮,每次進行登入時讓使用者輸入手機驗證碼,為了簡訊介面不被頻繁訪問,
        會限制使用者每分鐘獲取驗證碼的頻率。
複製程式碼

1.2 List型別

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

圖片描述
實現方式: 列表型別是用來儲存多個有序的字串,列表中的每個字串成為元素(element),一個列表最多可以儲存2的32次方-1個元素,list的實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝佇列等也都是用的這個資料結構。 在redis中,可以隊列表兩端插入(pubsh)和彈出(pop),還可以獲取指定範圍的元素 列表、獲取指定索引下表的元素等,列表是一種比較靈活的資料結構,它可以充當棧和佇列的角色,在實際開發中有很多應用場景。 優點: 1.列表的元素是有序的,這就意味著可以通過索引下標獲取某個或某個範圍內的元素列表。 2.列表內的元素是可以重複的。 應用場景:
Redis list的應用場景非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。 Lists 就是連結串列,相信略有資料結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕鬆地實現最新訊息排行等功能。Lists的另一個應用就是訊息佇列,可以利用Lists的PUSH操作,將任務存在Lists中,然後工作執行緒再用POP操作將任務取出進行執行。Redis還提供了操作Lists中某一段的api,你可以直接查詢,刪除Lists中某一段的元素。 常用技巧: lpush+lpop=Stack(棧) lpush+rpop=Queue(佇列) lpush+ltrim=Capped Collection(有限集合) lpush+brpop=Message Queue(訊息佇列)

1.3 Set型別

集合型別也是用來儲存多個字串的元素,但和列表不同的是集合中不允許有重複的元素,並且集合中的元素是無序的,不能通過索引下標獲取元素,redis除了支援集合內的增刪改查,同時還支援多個集合取交集、並集、差集,併合理的使用好集合型別,能在實際開發中解決很多實際問題。 常用命令: sadd,spop,smembers,sunion 等。

圖片描述
常用場景: 標籤(tag):集合型別比較典型的使用場景,如一個使用者對娛樂、體育比較感興趣,另一個可能對新聞感興趣,這些興趣就是標籤,有了這些資料就可以得到同一標籤的人,以及使用者的共同愛好的標籤, 這些資料對於使用者體驗以及曾強使用者粘度比較重要。(使用者和標籤的關係維護應該放在一個事物內執行,防止部分命令失敗造成資料不一致) 常用技巧: sadd=tagging(標籤) spop/srandmember=random item(生成隨機數,比如抽獎) sadd+sinter=social Graph(社交需求)

1.4 Hash型別

在redis中雜湊型別是指鍵本身又是一種鍵值對結構,如 value={{field1,value1},......{fieldN,valueN}}
常用命令: hget,hset,hgetall 等。

圖片描述
使用場景: 雜湊結構相對於字串序列化快取資訊更加直觀,並且在更新操作上更加便捷。 所以常常用於使用者資訊等管理,但是雜湊型別和關係型資料庫有所不同,雜湊型別是稀疏的,而關係型資料庫是完全結構化的,關係型資料庫可以做複雜的關係查詢,而redis去模擬關係型複雜查詢開發困難,維護成本高。

1.5 有序集合型別

有序集合和集合有著必然的聯絡,他保留了集合不能有重複成員的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下標作為排序依據不同的是,它給每個元素設定一個分數,作為排序的依據。 常用命令: zadd,zrange,zrem,zcard等

圖片描述
實現方式: Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲得比較高的查詢效率,並且在實現上比較簡單。 使用場景: Redis有序序列的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。

另外還可以用Sorted Sets來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。