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技術文章整理合集——資料庫篇
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262362.html
標籤:PHP
上一篇:PHP中類的自動加載
下一篇:Python中字串的操作處理
