了解Redis這個核心資料型別

2022-07-05 15:48:16 字數 2920 閱讀 4712

tring型別是二進位制安全的,即string中可以包含任何資料。

redis 中的普通 string 採用 raw encoding 即原始編碼方式,該編碼方式會動態擴容,並通過提前預分配冗餘空間,來減少記憶體頻繁分配的開銷。

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

redis中的數字也存為 string 型別,但編碼方式跟普通 string 不同,數字採用整型編碼,字串內容直接設為整數值的二進位制位元組序列。

在儲存普通字串,序列化物件,以及計數器等場景時,都可以使用 redis 的字串型別,字串資料型別對應使用的指令包括 set、get、mset、incr、decr 等。

list列表,是乙個快速雙向鍊錶,儲存了一系列的 string 型別的字串值

對於常規的 pop、push 元素,效能很高,時間複雜度為 o(1),因為是列表直接追加或彈出。但對於通過隨機插入、隨機刪除,以及隨機範圍獲取,需要輪詢列表確定位置,效能就比較低下了。

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

set 是 string 型別的無序集合,set 中的元素是唯一的,即 set 中不會出現重複的元素。redis 中的集合一般是通過 dict 雜湊表實現的,所以插入、刪除,以及查詢元素,可以根據元素 hash 值直接定位,時間複雜度為 o(1)。

操作
有序集合中,每個元素都會關聯乙個 double 型別的 score 分數值。有序集合通過這個 score 值進行由小到大的排序。有序集合中,元素不允許重複,但 score 分數值卻允許重複。

操作
可以用有序集合來統計排行榜,實時重新整理榜單,還可以用來記錄學生成績,從而輕鬆獲取某個成績範圍內的學生名單,還可以用來對系統統計增加權重值,從而在 dashboard 實時展示。

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

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

bitmap點陣圖的特點是按位設定、求與、求或等操作很高效,而且儲存成本非常低,用來存物件標籤屬性的話,乙個 bit 即可存乙個標籤。可以用 bitmap,存使用者最近 n 天的登入情況,每天用 1 bit,登入則置 1。

使用經歷
統計使用者登入情況 : 1 2 3 5 天內登入

bitmap : 1 1 1 0 1

在儲存某個位置點時,首先利用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 不儲存元資料,只記錄待統計元素的估算數量,這個估算數量是乙個帶有 0.81% 標準差的近似值,在大多數業務場景,對海量資料,不足 1% 的誤差是可以接受的。

redis 的 hyperloglog 在統計時,如果計數數量不大,採用稀疏矩陣儲存,隨著計數的增加,稀疏矩陣占用的空間也會逐漸增加,當超過閥值後,則改為稠密矩陣,稠密矩陣占用的空間是固定的,約為12kb位元組。

通過 hyperloglog 資料型別,你可以利用 pfadd 向基數統計中增加新的元素,可以用 pfcount 獲得 hyperloglog 結構中儲存的近似基數數量,還可以用 hypermerge 將多個 hyperloglog 合併為乙個 hyperloglog 結構,從而可以方便的獲取合併後的基數數量。

hyperloglog 的特點是統計過程不記錄獨立元素,占用記憶體非常少,非常適合統計海量資料。在大中型系統中,統計每日、每月的 uv 即獨立訪客數,或者統計海量使用者搜尋的獨立詞條數,都可以用 hyperloglog 資料型別來進行處理。

php核心 資料型別

結構體內每乙個變數都獨佔一塊記憶體,並保持記憶體對齊 聯合體內所有變數公用同一塊記憶體,占用記憶體大小為聯合體中占用記憶體最大的變數的記憶體大小 每個變數的結構定義 struct zval struct u v uint32 t type info u1 union u2 zend value表示變...

python核心資料型別

序列運算子 本文採用版本pyton3.5 數字 int,long,float,complex,bool 字元 str,unicode 列表 list 字典 dict 元組 tuple 檔案 file 其他型別 集合 set frozenset,類型別,none str repr 或format 將非...

Python核心資料型別 概覽

python的核心資料型別有 數字,字串,列表,字典,元組,檔案等。物件型別 例子 可變性 數字345,3.45,345l,3 4j 不可變字串 spam eggs 不可變列表 1,a b 2 可變字典 可變元組 1,2,spam 不可變檔案 myfile open data r w 內建函式var...