Redis的數據類型及應用場景

2019-12-02     sandag

最近幾年,業界不斷湧現出很多各種各樣的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的倒序來獲取工作任務。讓重要的任務優先執行。

文章來源: https://twgreatdaily.com/zh-tw/hTZHx24BMH2_cNUgqiAn.html