1、字元串使用場景
a) 緩存功能
典型使用場景:Redis作為緩存層,MySQL作為存儲層,絕大部分請求的資料都是從Redis中擷取,由于Redis具有支撐高并發的特性,是以緩存通常能起到加速讀寫和降低後端壓力的作用。
開發提示:與MySQL等關系型資料庫不同的是,Redis沒有指令空間,而且也沒有對鍵名有強制要求,但設計合理的鍵名,有利于防止鍵沖突和項目的可維護性,比較推薦的方式是使用“業務名:對象名:id:[屬性]”作為鍵名。例如MySQL的資料庫名為vs,使用者表名為user,那麼對應的鍵可以用"vs:user:1","vs:user:1:name"來表示,如果目前Redis隻被一個業務使用,甚至可以去掉vs。如果鍵名比較長,例如"user:{uid}:friends:message:{mid}",可以在能描述含義的前提下适當減少鍵的長度,例如采用縮寫形式,進而減少由于鍵過長的記憶體浪費。
b) 計數
典型應用場景:視訊播放數計數的基礎元件,使用者每播放一次視訊,相應的視訊播放數就會自增1。Redis可以實作快速計數、查詢緩存的功能,同時資料可以異步落地到其他資料源。
開發提示:實際上一個真實的計數系統要考慮的問題會很多,防作弊、按照不同次元計數,資料持久化到底層資料源等。
c) 共享Session
典型應用場景:使用者登陸資訊,Redis将使用者的Session進行集中管理,每次使用者更新或查詢登陸資訊都直接從Redis中集中擷取。
d) 限速
典型應用場景:驗證碼接口通路頻率限制,使用者登陸時需要讓使用者輸入手機驗證碼,進而确定是否是使用者本人,但是為了短信接口不被頻繁通路,會限制使用者每分鐘擷取驗證碼的頻率,例如一分鐘不能超過5次。
2、哈希使用場景
a) 緩存使用者資訊
相比于使用字元串序列化緩存使用者資訊,哈希類型變得更加直覺,并且在更新操作上會更加便捷。可以将每個使用者的id定義為鍵字尾,多對field-value對應每個使用者的屬性。
哈希類型和關系型資料庫不同之處:
哈希類型是稀疏的,而關系型資料庫是完全結構化的,例如哈希類型每個鍵可以有不同的field,而關系型資料庫一旦添加新的列,所有行都要為其設定值(即使為NULL)。
關系型資料庫可以做複雜的關系查詢,而Redis去模拟關系型複雜查詢開發困難,維護成本高。
三種緩存使用者資訊優缺點比較:
原生字元串類型:每個屬性一個鍵
優點:簡單直覺,每個屬性都支援更新操作。
缺點:占用過多的鍵,記憶體占用量較大,同時使用者資訊内聚性比較差,是以此種方案一般不會在生産環境使用。
序列化字元串類型:将使用者資訊序列化後用一個鍵儲存。
優點:簡化程式設計,如果合理的使用序列化可以提高記憶體的使用效率。
缺點:序列化和反序列化有一定的開銷,同時每次更新屬性都需要把全部資料取出進行反序列化,更新後再序列化到Redis中。
哈希類型:每個使用者屬性使用一對field-value,但是隻用一個鍵儲存。
優點:簡單直覺,如果使用合理可以減少記憶體空間的使用。
缺點:要控制哈希在ziplist和hashtable兩種内部編碼的轉換,hashtable會消耗更多記憶體。
3、清單使用場景
a) 消息隊列
Redis的lpush+brpop指令組合即可實作阻塞隊列,生産者用戶端使用lrpush從清單左側插入元素,多個消費者用戶端使用brpop指令阻塞式的"搶"清單尾部的元素,多個用戶端保證了消費的負載均衡和高可用性。
b) 文章清單
每個使用者有屬于自己的文章清單,現在需要分頁展示文章清單。此時可以考慮使用清單,因為清單不但是有序的,同時支援按照索引範圍擷取元素。
c) 開發提示
lpush + lpop = Stack(棧)
lpush + rpop = Queue(隊列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息隊列)
4、集合
a) 标簽(tag)
集合類型比較典型的使用場景是标簽(tag),例如一個使用者可能對娛樂、體育比較感興趣,另一個使用者可能對曆史、新聞比較感興趣,這些興趣就是标簽。開發提示:使用者和标簽的關系維護應該在一個事物執行,防止部分指令失敗造成的資料不一緻。
5、有序集合