瞭解Redis這個核心數據類型

来源:https://www.cnblogs.com/a609251438/archive/2020/07/04/13236425.html
-Advertisement-
Play Games

string 字元串 tring 類型是二進位安全的,即 string 中可以包含任何數據。 Redis 中的普通 string 採用 raw encoding 即原始編碼方式,該編碼方式會動態擴容,並通過提前預分配冗餘空間,來減少記憶體頻繁分配的開銷。 在字元串長度小於 1MB 時,按所需長度的 2 ...


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 數據類型來進行處理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • pygame 的聲音播放 1. sound 對象 在初始化聲音設備後就可以讀取一個音樂文件到一個 Sound 對象中。pygame.mixer.sound() 接收一個文件名,也可以是一個文件對象,不過這個文件對象必須是 WAV 或者 OGG 文件。 hello_sound = pygame.mix ...
  • 在使用dubbo時,通常會遇到timeout這個屬性,timeout屬性的作用是:給某個服務調用設置超時時間,如果服務在設置的時間內未返回結果,則會拋出調用超時異常:TimeoutException,在使用的過程中,我們有時會對provider和consumer兩個配置都會設置timeout值,那麼 ...
  • JAVA線程虛假喚醒 線程虛假喚醒問題描述 ​ 在JDK API文檔中,關於Object類的wait()方法有這樣一句話描述"線程也可以喚醒,而不會被通知,中斷或超時,即所謂的虛假喚醒 。 雖然這在實踐中很少會發生,但應用程式必須通過測試應該使線程被喚醒的條件來防範,並且如果條件不滿足則繼續等待", ...
  • 原文地址:https://www.wjcms.net/archives/vue%E5%AE%89%E8%A3%85%E5%8F%8A%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F VU ...
  • 原文地址:https://www.wjcms.net/archives/node%E6%9B%B4%E6%96%B0%E6%8A%A5%E9%94%99checkpermissionsmissingwriteaccesstousrlibnodemodulesn node更新報錯:checkPermi ...
  • 有道無術,術可求; 有術無道,止於術; 讀源碼是一個很枯燥的過程,但是Spring源碼裡面有很多值得學習的地方 加油~!!!!! 前言 使用SpringMVC的時候,通常使用下麵這行代碼來載入Spring的配置文件 ApplicationContext application = new Class ...
  • 今天就來教大家這個套路: 如何使用 Python 來做出來這樣有點浪漫,又有點極客的“內涵”圖。 當然,能不能靠它得到心儀對象的青睞,就要靠你(命)了。(๑•́₃ •̀๑) 那麼要怎麼做呢? 我們先找一張女神的高清圖片(儘量解析度高點的吧,效果會好點)。這裡以一張原圖是這樣的(解析度是:3840*2 ...
  • # 利用雙指針,一次遍歷,求出結果class Solution: def isPalindrome(self, s: str) -> bool: # 定義變數,接收字元串的長度 length = len(s) # 長度小於等於1直接返回真 if length <= 1:return True # 定 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...