首頁 php框架 Laravel 了解Redis這個核心資料類型

了解Redis這個核心資料類型

Jul 03, 2020 pm 05:20 PM
laravel redis

了解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 進行求與、或、異或等操作。

Redis 笔记

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 資料類型來處理。      

相關學習建議:Laravel     #   

以上是了解Redis這個核心資料類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

Laravel如何學習 怎麼免費學習Laravel Laravel如何學習 怎麼免費學習Laravel Apr 18, 2025 pm 12:51 PM

想要學習 Laravel 框架,但苦於沒有資源或經濟壓力?本文為你提供了免費學習 Laravel 的途徑,教你如何利用網絡平台、文檔和社區論壇等資源,從入門到掌握,為你的 PHP 開發之旅奠定堅實基礎。

laravel用戶登錄功能 laravel用戶登錄功能 Apr 18, 2025 pm 12:48 PM

Laravel 提供了一個全面的 Auth 框架,用於實現用戶登錄功能,包括:定義用戶模型(Eloquent 模型)創建登錄表單(Blade 模板引擎)編寫登錄控制器(繼承 Auth\LoginController)驗證登錄請求(Auth::attempt)登錄成功後重定向(redirect)考慮安全因素:哈希密碼、防 CSRF 保護、速率限制和安全標頭。此外,Auth 框架還提供重置密碼、註冊和驗證電子郵件等功能。詳情請參閱 Laravel 文檔:https://laravel.com/doc

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

laravel有哪些版本 laravel新手版本選擇方法 laravel有哪些版本 laravel新手版本選擇方法 Apr 18, 2025 pm 01:03 PM

在面向初学者的 Laravel 框架版本选择指南中,本文深入探討了 Laravel 的版本差異,旨在協助初學者在眾多版本之間做出明智的選擇。我們將重點介紹每個版本的關鍵特徵、比較它們的優缺點,並提供有用的建議,幫助新手根據他們的技能水準和項目需求挑選最合適的 Laravel 版本。對於初學者來說,選擇一個合適的 Laravel 版本至關重要,因為它可以顯著影響他們的學習曲線和整體開發體驗。

laravel怎麼查看版本號 laravel查看版本號方法 laravel怎麼查看版本號 laravel查看版本號方法 Apr 18, 2025 pm 01:00 PM

Laravel框架內置了多種方法來方便地查看其版本號,滿足開發者的不同需求。本文將探討這些方法,包括使用Composer命令行工具、訪問.env文件或通過PHP代碼獲取版本信息。這些方法對於維護和管理Laravel應用程序的版本控制至關重要。

laravel和thinkphp的區別 laravel和thinkphp的區別 Apr 18, 2025 pm 01:09 PM

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發中各有優缺點。本文將深入比較這兩者,重點介紹它們的架構、特性和性能差異,以幫助開發者根據其特定項目需求做出明智的選擇。

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

See all articles