學習下Redis這個核心數據類型

string 字符串

tring 類型是二進制安全的,即 string 中能夠包含任何數據。面試

Redis 中的普通 string 採用 raw encoding 即原始編碼方式,該編碼方式會動態擴容,並經過提早預分配冗餘空間,來減小內存頻繁分配的開銷。算法

在字符串長度小於 1MB 時,按所需長度的 2 倍來分配,超過 1MB,則按照每次額外增長 1MB 的容量來預分配。數據庫

Redis 中的數字也存爲 string 類型,但編碼方式跟普通 string 不一樣,數字採用整型編碼,字符串內容直接設爲整數值的二進制字節序列安全

在存儲普通字符串,序列化對象,以及計數器等場景時,均可以使用 Redis 的字符串類型,字符串數據類型對應使用的指令包括 set、get、mset、incr、decr 等。數據結構

list 列表

list 列表,是一個快速雙向鏈表,存儲了一系列的 string 類型的字串值架構

對於常規的 pop、push 元素,性能很高,時間複雜度爲 O(1),由於是列表直接追加或彈出。但對於經過隨機插入、隨機刪除,以及隨機範圍獲取,須要輪詢列表肯定位置,性能就比較低下了。併發

操做 list 列表時,能夠用 lpush、lpop、rpush、rpop、lrange 來進行常規的隊列進出及範圍獲取操做,在某些特殊場景下,也能夠用 lset、linsert 進行隨機插入操做,用 lrem 進行指定元素刪除操做;最後,在消息列表的消費時,還能夠用 Blpop、Brpop 進行阻塞式獲取,從而在列表暫時沒有元素時,能夠安靜的等待新元素的插入,而不須要額外持續的查詢。框架

set 集合

set 是 string 類型的無序集合,set 中的元素是惟一的,即 set 中不會出現重複的元素。Redis 中的集合通常是經過 dict 哈希表實現的,因此插入、刪除,以及查詢元素,能夠根據元素 hash 值直接定位,時間複雜度爲 O(1)。分佈式

操做
  • sismember 指令判斷該 key 對應的 set 數據結構中,是否存在某個元素,若是存在返回 1,不然返回 0;
  • sdiff 指令來對多個 set 集合執行差集;
  • sinter 指令對多個集合執行交集;
  • sunion 指令對多個集合執行並集;
  • spop 指令彈出一個隨機元素;
  • srandmember 指令返回一個或多個隨機元素。

在社交系統中,能夠用於存儲關注的好友列表,用來判斷是否關注,還能夠用來作好友推薦使用。另外,還能夠利用 set 的惟一性,來對服務的來源業務、來源 IP 進行精確統計。微服務

sorted set 有序集合

有序集合中,每一個元素都會關聯一個 double 類型的 score 分數值。有序集合經過這個 score 值進行由小到大的排序。有序集合中,元素不容許重複,但 score 分數值卻容許重複。

操做
  • zscan 指令:按順序獲取有序集合中的元素;
  • zscore 指令:獲取元素的 score 值;
  • zrange指令:經過指定 score 返回指定 score 範圍內的元素;
  • 在某個元素的 score 值發生變動時,還能夠經過 zincrby 指令對該元素的 score 值進行加減。
  • 經過 zinterstore、zunionstore 指令對多個有序集合進行取交集和並集,而後將新的有序集合存到一個新的 key 中,若是有重複元素,重複元素的 score 進行相加,而後做爲新集合中該元素的 score 值。

能夠用有序集合來統計排行榜,實時刷新榜單,還能夠用來記錄學生成績,從而輕鬆獲取某個成績範圍內的學生名單,還能夠用來對系通通計增長權重值,從而在 dashboard 實時展現。

hash 哈希

bitmap

位圖是一串連續的二進制數字,底層實際是基於 string 進行封裝存儲的

按 bit 位進行指令操做的。bitmap 中每一 bit 位所在的位置就是 offset 偏移,能夠用 setbit、bitfield 對 bitmap 中每一個 bit 進行置 0 或置 1 操做,也能夠用 bitcount 來統計 bitmap 中的被置 1 的 bit 數,還能夠用 bitop 來對多個 bitmap 進行求與、或、異或等操做。

bitmap 位圖的特色是按位設置、求與、求或等操做很高效,並且存儲成本很是低,用來存對象標籤屬性的話,一個 bit 便可存一個標籤。能夠用 bitmap,存用戶最近 N 天的登陸狀況,天天用 1 bit,登陸則置 1。

個性推薦在社交應用中很是重要,能夠對新聞、feed 設置一系列標籤,如軍事、娛樂、視頻、圖片、文字等,用 bitmap 來存儲這些標籤,在對應標籤 bit 位上置 1。對用戶,也能夠採用相似方式,記錄用戶的多種屬性,並能夠很方便的根據標籤來進行多維度統計。bitmap 位圖的重要指令包括:setbit、 getbit、bitcount、bitfield、 bitop、bitpos 等。

使用經歷

統計用戶登陸狀況 : 1 2 3 5 天內登陸
bitmap : 1 1 1 0 1

GEO 地理位置

在存儲某個位置點時,首先利用 Geohash 算法,將該位置二維的經緯度,映射編碼成一維的 52 位整數值,將位置名稱、經緯度編碼 score 做爲鍵值對,存儲到分類 key 對應的 sorted set 中。

須要計算某個位置點 A 附近的人時,首先以指定位置 A 爲中心點,以距離做爲半徑,算出 GEO 哈希 8 個方位的範圍, 而後依次輪詢方位範圍內的全部位置點,只要這些位置點到中心位置 A 的距離在要求距離範圍內,就是目標位置點。輪詢完全部範圍內的位置點後,從新排序即獲得位置點 A 附近的全部目標。

使用 geoadd,將位置名稱(如人、車輛、店名)與對應的地理位置信息添加到指定的位置分類 key 中;

使用 geopos 方便地查詢某個名稱所在的位置信息;

使用 georadius 獲取指定位置附近,不超過指定距離的全部元素;

Redis GEO 地理位置,利用 Geohash 將大量的二維經緯度轉一維的整數值,這樣能夠方便的對地理位置進行查詢、距離測量、範圍搜索。但因爲地理位置點很是多,一個地理分類 key 下可能會有大量元素,在 GEO 設計時,須要提早進行規劃,避免單 key 過分膨脹。

Redis 的 GEO 地理位置數據結構,應用場景不少,好比查詢某個地方的具體位置,查當前位置到目的地的距離,查附近的人、餐廳、電影院等。GEO 地理位置數據結構中,重要指令包括 geoadd、geopos、geodist、georadius、georadiusbymember 等。

使用 geodist 來獲取指定的兩個位置之間的距離。

hyperLogLog 基數統計

hyperLogLog 是用來作基數統計的數據類型,當輸入巨大數量的元素作統計時,只須要很小的內存便可完成。HyperLogLog 不保存元數據,只記錄待統計元素的估算數量,這個估算數量是一個帶有 0.81% 標準差的近似值,在大多數業務場景,對海量數據,不足 1% 的偏差是能夠接受的。

Redis 的 HyperLogLog 在統計時,若是計數數量不大,採用稀疏矩陣存儲,隨着計數的增長,稀疏矩陣佔用的空間也會逐漸增長,當超過閥值後,則改成稠密矩陣,稠密矩陣佔用的空間是固定的,約爲12KB字節。

經過 hyperLoglog 數據類型,你能夠利用 pfadd 向基數統計中增長新的元素,能夠用 pfcount 得到 hyperLogLog 結構中存儲的近似基數數量,還能夠用 hypermerge 將多個 hyperLogLog 合併爲一個 hyperLogLog 結構,從而能夠方便的獲取合併後的基數數量。

hyperLogLog 的特色是統計過程不記錄獨立元素,佔用內存很是少,很是適合統計海量數據。在大中型系統中,統計每日、每個月的 UV 即獨立訪客數,或者統計海量用戶搜索的獨立詞條數,均可以用 hyperLogLog 數據類型來進行處理。

以上內容但願幫助到你們,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文免費獲取能夠關注公衆號:PHP開源社區,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分佈式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——數據庫篇

相關文章
相關標籤/搜索