Java面試八股之Redis有哪些數據類型?底層實現分別是什么

  1. Redis有哪些數據類型?底層實現分別是什么

Redis數據類型概述

Redis作為一款鍵值存儲系統,提供了豐富多樣的數據類型以滿足不同場景的需求。以下是Redis支持的主要數據類型及其基本用途:

String(字符串)

存儲單個鍵值對,支持增刪改查、自增、截取等操作。

應用場景:計數器、緩存、分布式鎖等。

底層實現:Redis字符串是動態字符串(SDS),其內部結構包含長度、已用長度和字節數組。

編碼方式:Redis對字符串值的存儲采用多種編碼,如:

REDIS_ENCODING_INT:當值為整數且在一定范圍內時,直接存儲整數值,節省空間。

REDIS_ENCODING_EMBSTR:對于短字符串,使用embstr編碼,將字符串與結構體緊湊存儲在同一塊連續內存中,減少內存分配次數。

REDIS_ENCODING_RAW:長字符串或非整數值使用raw編碼,即傳統的簡單動態字符串。

List(列表)

有序的字符串列表,支持兩端插入、彈出、范圍查詢等操作。

應用場景:消息隊列、最新N個元素列表等。

底層實現:列表有兩種編碼方式,分別是:

ziplist(壓縮列表):對于元素數量少且元素長度較短的列表,使用連續內存存儲,節省空間。

linkedlist(雙端鏈表):當列表元素數量或長度超過一定閾值時,轉為雙端鏈表實現,保證操作的高效性。

Set(集合)

無序的字符串集合,不允許重復成員,支持添加、刪除、成員關系判斷等操作。

應用場景:標簽系統、唯一性檢查、交并差集運算等。

底層實現:集合也有兩種編碼:

intset(整數集合):當集合中所有元素都是整數且范圍適當時,使用整數集合存儲,空間效率高。

hashtable(哈希表):當集合包含非整數元素或元素數量超過一定閾值時,轉化為哈希表實現,提供快速的增刪查操作。

Sorted Set(有序集合)

類似集合,但每個成員附帶一個分數,依據分數進行排序。

支持添加、刪除、按分數范圍查詢、排名、聚合操作等。

應用場景:排行榜、帶權重的標簽系統、Top N查詢等。

底層實現:有序集合基于ziplist或skiplist(跳躍表)編碼:

ziplist:小型有序集合,使用壓縮列表存儲,元素按分數排序。

skiplist:大型有序集合,使用跳躍表實現,提供O(log N)的插入、刪除、查找等操作,同時保留了集合成員的順序。

Hash(哈希)

鍵值對的集合,每個鍵值對由field-value組成。

支持增刪改查單個field,批量操作整個哈希。

應用場景:對象屬性存儲、購物車等。

底層實現:哈希同樣存在兩種編碼:

ziplist:對于小規模哈希(字段數量和值長度較小),使用壓縮列表存儲,緊湊且高效。

hashtable:當哈希的字段數量或值長度超過閾值時,轉化為哈希表實現,提供快速的字段查找和更新。

Bitmaps(位圖)

功能:Bitmaps允許以位(bit)為單位存儲數據,非常適合用來表示稀疏的二進制狀態,如用戶簽到、統計用戶行為等。

應用案例:用戶簽到系統

假設有一個網站需要記錄用戶每天的簽到情況。對于每個用戶,我們可以使用一個唯一的用戶ID作為鍵名,用Bitmaps來表示其連續365天的簽到狀態。每天簽到時,使用SETBIT命令將對應日期的位設置為1。查詢用戶在過去一周是否有連續簽到,則可通過BITCOUNT命令計算過去7天的位圖中值為1的位數。

底層實現:在Redis中,位圖實際上是基于字符串(String)類型實現的,每個字節(8位)對應字符串中的一個字符。通過對字符串執行位操作命令(如SETBIT,?GETBIT,?BITCOUNT,?BITOP等),可以高效地進行位的增刪查改。

HyperLogLog

功能:HyperLogLog是一種概率數據結構,用于估算集合中不重復元素(基數)的大致數量,而不需要存儲所有元素。它以極小的空間開銷(通常幾百字節)提供接近精確的計數,適用于大規模唯一計數場景,如網站獨立訪客統計、唯一事件計數等。

應用案例:網站獨立訪客統計

在一個網站中,需要統計每天訪問的獨立訪客數,但不想為每個訪客保存完整的訪問記錄。可以為每天創建一個HyperLogLog鍵,每當有新的訪客訪問時,將其唯一標識符(如IP地址或用戶代理字符串的哈希值)添加到當天的HyperLogLog中。使用PFADD命令添加元素,PFCOUNT命令獲取估計的獨立訪客數。

底層實現:HyperLogLog使用特定的哈希函數和概率算法估計基數,不直接存儲元素,而是維護一個內部狀態來近似計數。

Geospatial Indexes(地理位置索引)

功能:Redis提供了對地理位置數據的支持,可以存儲經緯度坐標,并進行距離查詢、范圍查詢(如“附近的人”功能)、地理圍欄(如“在某區域內的人”)等操作。

應用案例:“附近的人”功能

在社交應用中,用戶可以查看當前位置附近的其他在線用戶。為每個用戶存儲其經緯度坐標,使用GEOADD命令將用戶位置添加到地理位置索引中。當查詢時,使用GEORADIUS或GEORADIUSBYMEMBER命令查找指定半徑內的其他用戶。

底層實現:使用有序集合(Sorted Set)存儲地理位置數據,成員為地理位置的標識符,分值為經過特定公式轉換后的經緯度坐標,以此實現空間索引。

Streams(流)

功能:Redis Streams是一種用于存儲和處理時間序列數據的數據結構,特別適用于構建消息隊列、活動日志、審計跟蹤等應用場景。它支持多消費者消費同一數據流的不同部分,并具備消息持久化、消息ID生成、消息分片(Consumer Group)等功能。

應用案例:訂單事件日志

在電商系統中,使用Redis Stream記錄訂單相關的事件,如訂單創建、支付成功、發貨等。每個事件作為一個消息,包含事件類型、發生時間、訂單ID等信息。消費者(如后臺任務、實時分析服務)通過XREAD或XREADGROUP命令訂閱并處理這些事件。

底層實現:Stream數據結構在內部以鍵值對的形式存儲,鍵為Stream的名字,值為一個特殊的字典結構,包含多個消息列表(每個消息列表代表一個分片)以及相關元數據。

如果大家需要視頻版本的講解,歡迎關注我的B站:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44796.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows系統上python3安裝open3d第三方庫

打開命令提示符,輸入, pip install open3d -i https://pypi.tuna.tsinghua.edu.cn/simple成功頁面,

CSDN回顧與前行:我的創作紀念日——2048天的技術成長與感悟

CSDN回顧與前行:我的創作紀念日——2048天的技術成長與感悟 💖The Begin💖點點關注,收藏不迷路💖 前言 時光荏苒,歲月如梭。轉眼間,從我在CSDN上寫下第一篇技術博客《2-6 帶頭結點的鏈式表操作…

MVC 控制器 中Action 不能同名,參數不一樣,路由器尋找不到對應的,要加特性

//1 方法不可能完全相同,參數不同//2 那還需要特性嗎?需要的,因為MVC選擇方法時,不是按參數選擇:http請求發送很多數據,其實沒法識別,//因為mvc找方法是通過反射來的,GetMethods(nam…

【SQL】InnoDB中的行鎖

InnoDB 里的行鎖機制主要通過索引來實現,而不是直接對表中的記錄加鎖。具體來說,InnoDB 使用以下幾種鎖定機制來實現行鎖: 記錄鎖 (Record Lock):鎖定單個索引記錄。間隙鎖 (Gap Lock):鎖定索引記錄之間的間隙&#x…

vue 自定義(hook)--(模塊化)

文章目錄 定義示例代碼 定義 什么是hook?—— 本質是一個函數,把setup函數中使用的Composition API進行了封裝,類似于vue2.x中的mixin。 自定義hook的優勢:復用代碼, 讓setup中的邏輯更清楚易懂。 示例代碼 useSum.ts中內容如下…

react學習——26redux實現求和案例(異步action)

1、安裝redux-thunk npm install redux-thunk npm install redux-thunk2、redux/store.js 引入redux-thunk /*該文件專門用于創建一個為Count組件服務的store對象*/ //引入createStore,專門創建redux中最為核心的store對象 import {createStore,applyMiddleware} from redux …

Python:引號應用、字符串應用

# 把前面的引號理解為起始符,后面的理解為終止符 # 單雙引號的靈活運用 想輸出"hello,Q" 用單引號 # 想輸出 This is Qs 用雙引號 # 想輸出既有單引號又有雙引號或者特定格式 用三對單引號### word "hello,Q" word2 "This is Qs" …

mavlink協議解析

1. mavlink數據包格式 字節索引C 版本內容值說明0uint8_t magic數據包啟動標記0xFE特定于協議的文本啟動 (stx) 標記, 用于指示新數據包的開始。 任何不識別協議版本的系統都將跳過數據包。1uint8_t len載荷長度0 - 255指示以下 payload 部分的長度 (為特定消息固定)。2uint8_t…

java并發編程概述

java并發編程概述 一. 進程和線程的概念 進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配的基本單位。進程是程序運行的實例,每當操作系統在運行一個程序時,會為其創建一個進程。每個進程都擁有自己的一整套變量。…

python:openpyxl DataBarRule 制作數據條

技術文檔: 條件格式 — openpyxl 3.0.7 文檔 openpyxl.formatting.rule module — openpyxl 3.1.3 documentation 但是,想讓單元格數值按比例顯示(右邊正確)只能按data_bar_rule_2編寫: from openpyxl import Workb…

微服務中的 “客戶端負載均衡” 簡介

微服務中的客戶端負載均衡是指將負載(即工作任務或訪問請求)在客戶端進行分配,以決定由哪個服務實例來處理這些請求。這種負載均衡方式與服務端負載均衡相對,后者是在服務端(如服務器或負載均衡器)進行請求…

系統設計題-路由表最長匹配

一、題目 路由表最長匹配:將目標IP地址dstIP與路由為entryIP/掩碼長度m(比如10.166.50.0/23)進行匹配,找出匹配掩碼m最長值。 匹配規則: 如果dstIP和entryIP的二進制表示的前m個位相同,則說明是匹配的。 0…

抖音必備工具!掌握螢瓴優選櫥窗帶貨軟件的五大優勢,助你快速盈利

在當今數字化時代,抖音作為一款備受歡迎的短視頻社交平臺,不僅為人們提供了展示自我的舞臺,更成為了眾多商家和個人創業者推廣產品和服務的重要渠道。然而,要在抖音上實現高效帶貨,并非易事。幸運的是,螢瓴…

技校專業群的生成機制研究

一、引言 隨著我國經濟的快速發展和產業結構的不斷優化,技術型人才的需求日益旺盛。技工學校(簡稱技校)作為培養技術型人才的搖籃,其專業群的構建與發展顯得尤為重要。專業群作為技校戰略發展的核心,不僅能夠優化教學…

Python 腳本編寫指南:從框架到實踐

一、引言 Python 作為一種強大且易于學習的編程語言,在各個領域都有著廣泛的應用。編寫 Python 腳本是實現各種功能和任務的常見方式。 二、Python 腳本框架的基本組成部分 導入必要的模塊 在腳本的開頭,我們通常需要導入所需的 Python 模塊&#xff…

大模型之戰進入新賽季,開始卷應用

最近一段時間,國產大模型Kimi徹底火了,而這波爆火,某種意義上也展示了一個問題,即大模型的落地場景可能比技術比拼,更重要。 國產大模型Kimi突然爆火,與Kimi相關的產業鏈甚至被冠上“Kimi概念股”之名&…

【初階數據結構】樹與二叉樹:從零開始的奇幻之旅

初階數據結構相關知識點可以通過點擊以下鏈接進行學習一起加油!時間與空間復雜度的深度剖析深入解析順序表:探索底層邏輯深入解析單鏈表:探索底層邏輯深入解析帶頭雙向循環鏈表:探索底層邏輯深入解析棧:探索底層邏輯深入解析隊列:探索底層邏輯深入解析循環隊列:探索…

day10:03 一文搞懂encode和encoding的區別

在Python中,處理字符串時經常會遇到encode()方法和encoding參數,它們都與字符串的編碼和解碼有關,但用途和上下文有所不同。下面通過案例來解釋它們的關系和區別。 1. encode() 方法 encode()方法是字符串(str)類型的…

《簡歷寶典》08 - 簡歷中“教育背景”模塊如何揚長避短

目錄 1 本文概述 2 必須寫的信息 3 學歷的優勢凸顯 4 專業的重要性 5 如果所學專業與當前求職的職位不匹配 6 在校期間獲得的獎項和證書 7 最后 1 本文概述 前兩節我們把個人信息模塊做了拆分講解,分為必寫的信息項和根據個人情況酌情添加的信息項&#xff0…

51單片機:如何使用串口波特率計算器及其詳解

目錄 一、如何使用串口波特率計算器 1.以此為例: 2.生成代碼如下: 3.需要手動配置中斷系統 1.原理圖 2.配置代碼 二、如何理解軟件生成的波特率 1.以該代碼為例子進行分析 2.串口模式圖 三、如何計算波特率 參考STC89C52手冊P235 四、如何調用串口中斷函數 一、如何…