Redis的數據類型及應用場景

最近幾年,業界不斷涌現出不少各類各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是咱們須要深刻研究和思考的問題,在實際應用中作到揚長避短.redis

1. redis中經常使用的數據類型

1.1 String類型

Strings 數據結構是簡單的key-value類型,key是字符串類型,value能夠是String(簡單的字符串、複雜的字符串(xml、json),也能夠是數字(整數、浮點數)、二進制(圖片、音頻、視頻)),但最大不能超過512M.sql

經常使用命令:  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等。 json

圖片描述
實現方式: 列表類型是用來儲存多個有序的字符串,列表中的每一個字符串成爲元素(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 等。 api

圖片描述
使用場景: 哈希結構相對於字符串序列化緩存信息更加直觀,而且在更新操做上更加便捷。 因此經常用於 用戶信息等管理,可是哈希類型和關係型數據庫有所不一樣,哈希類型是稀疏的,而關係型數據庫是徹底結構化的,關係型數據庫能夠作複雜的關係查詢,而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的倒序來獲取工做任務。讓重要的任務優先執行。安全

相關文章
相關標籤/搜索