redis存儲原理與對象模型

redis中的不同線程

redis單線程是指什么?

redis的所有命令處理都在同一個線程中完成

redis為什么采用單線程?

redis中存在多種數據結構存儲value,如果采用多線程,加鎖會很復雜、加鎖力度不阿紅控制,同時,采用多線程涉及頻繁的cpu上下文切換,抵消多線程的優勢。

redis 存儲結構

redis采用hashtable組織其存儲的kv數據

hashtable字典實現

redis 中 hashtable 組織是通過字典來實現的;hash 結構當節點超過 512 個或者單個字符串長度大于 64 時,hash 結構采用字典實現

數據結構

typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;} dictEntry;typedef struct dictht {dictEntry **table;unsigned long size;// 數組長度
unsigned long sizemask; //size-1unsigned long used;//當前數組當中包含的元素
} dictht;typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */int16_t pauserehash; /* If >0 rehashing is paused (<0 indicates coding error) 
用于安全遍歷*/} dict;

沖突

抽屜原理 :n+1個蘋果放在 n 個抽屜中,蘋果最多的那個抽屜至少有 2 個蘋果;64位整數遠大 于數組的長度,比如數組長度為 4,那么 1、5、9、1+4n 都是映射到1號位數組;所以大概 率會發生沖突

抽屜就是hashtable,蘋果就是對應k-v對。

負載因子

負載因子 = used / size ;

used 是數組存儲元素的個數,size是hashtable大小

負載因子越小,沖突越小;負載因子越大,沖突越大;

redis 的負載因子是 1;

擴容

如果負載因子 > 1,為了避免頻繁的hash沖突,則會發生擴容,即申請一個新的的數組;擴容的規則是翻倍;

如果正在 fork(在 rdb、aof 復寫以及 rdb-aof 混用情況下)時,會阻止擴容;但是此時若負載 因子 > 5,索引效率大大降低, 則馬上擴容;這里涉及到寫時復制原理

擴容后的漸進式rehash

rehash的原因

擴容后,hashtable的size發生改變,基于原來size的映射規則不在適用

rehash步驟

將 ht[0] 中的元素重新經過 hash 函數生成 64 位整數,再對 射到 ht [1] ;

漸進式rehash的原因

當 hashtable 中的元素過多的時候,不能一次性 rehash 到 ht[1] ;這樣會長期占用 redis,其他 命令得不到響應;所以需要使用漸進式 rehash;

漸進式規則

?1. 分治的思想,將 rehash 分到之后的每步增刪改查的操作當中;

2. 在定時器中,最大執行一毫秒 rehash ;每次步長 100 個數組槽位;

處于漸進式 rehash 階段時,不會會發生擴容縮容

縮容

如果負載因子 < 0.1 ,則會發生縮容;縮容的規則是恰好包含 used 的 2^n

恰好的理解:假如此時數組存儲元素個數為 9,恰好包含該元素的就是2^{4} ,也就是 16;

redis-value存儲轉換

跳表

理想跳表到概率跳表

redis跳表

redis IO多線程處理

為什么要采用IO多線程?

多個連接同時發送數據到redis時,會導致IO密集操作(read和send)和cpu密集型操作(decode和encode),如果采用單線程處理,就只能串行的處理每個連接的數據,但是read、decode、encode和send是可以并行執行的。

處理流程

1.主線程將IO密集型任務和cpu密集型任務放入全局隊列中,并分配給每個IO線程并行執行。

2.所有的命令處理由一個線程單獨執行

3.結果處理再交由每個IO線程執行。

redis的單線程為什么高效?

1.采用hashtable,使其增刪改查操作時間復雜度為O(1),同時采用漸進式rehash,避免長時間對redis的占用。

2.對不同value采用高效的數據結構,同時基于節點數量會對數據結構進行切換。

3.采用高效的reactor網絡模型,基于IO多路復用,實現對網絡多客戶端連接的快速響應。

柔性數組

https://github.com/0voice

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

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

相關文章

基于微信小程序的家教服務平臺的設計與實現/基于asp.net/c#的家教服務平臺/基于asp.net/c#的家教管理系統

基于微信小程序的家教服務平臺的設計與實現/基于asp.net/c#的家教服務平臺/基于asp.net/c#的家教管理系統

安全審計-iptales防火墻設置

文章目錄一、iptales防火墻設置1.ip規則設置2.ip端口規則設置3.刪除規則4.INPUT默認設置5.ping、本地訪問規則6.保存還原規則7.查看清除規則一、iptales防火墻設置 1.ip規則設置 #允許ip訪問本服務器 iptables -I INPUT -s 192.168.205.129 -p tcp -j ACCEPT#允許某IP或某網段…

Linux小白加油站,第二周

1.grep命令中哪個選項可以忽略大小寫進行搜索?grep -i 2.如何用grep命令查找包含”error關鍵字的日志文件并返回文件名?grep -lr3.解釋grep命令中^f...d$這個表達式的含義^f&#xff1a;以f開頭..&#xff1a;任意兩個字符d$&#xff1a;以d結尾4.如何過濾掉文件中的注釋行以…

【前端基礎】19、CSS的flex布局

一、FlexBox概念 FlexBox翻譯為彈性盒子。 彈性盒子是一種用于按行或按列布局元素的一維布局方式。元素可以膨脹以填充額外的空間&#xff0c;收縮以適應更小的空間。我們使用FlexBox來進行布局的方案稱為flex布局。二、flex布局的重要概念 兩個重要的概念 開啟flex布局的元素叫…

Effective C++ 條款46:需要類型轉換時請為模板定義非成員函數

Effective C 條款46&#xff1a;需要類型轉換時請為模板定義非成員函數核心思想&#xff1a;當模板類需要支持隱式類型轉換時&#xff0c;應將非成員函數聲明為友元并定義在類內部&#xff08;或通過輔助函數實現&#xff09;&#xff0c;以繞過模板參數推導的限制&#xff0c;…

用Python對機器學習數據進行縮放

許多機器學習算法期望數據被一致地縮放。 在為機器學習擴展數據時&#xff0c;你應該考慮兩種常用的方法。 在這個教程中&#xff0c;您將了解如何為機器學習重新縮放您的數據。閱讀完這個教程后&#xff0c;您將知道&#xff1a; 如何從頭開始對您的數據進行標準化。如何從…

Application-properties 配置大全

SpringBoot - application.properties 配置大全 SpringBoot項目最重要也是最核心的配置文件就是application.properties&#xff0c;所有的框架配置都需要在這個配置文件中說明&#xff0c;以下配置不會的可以進行查閱并修改 &#xff03;SPRING CONFIG&#xff08;ConfigFileA…

MXFP4量化:如何在80GB GPU上運行1200億參數的GPT-OSS模型

大型語言模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-OSS、GPT-4、LLaMA和Mixtral的快速發展顯著提升了人工智能的能力邊界&#xff0c;但同時也帶來了嚴峻的內存資源挑戰。以1200億參數的模型為例&#xff0c;在FP16精度下僅權重存儲就需要約240GB的內存空…

Unity進階--C#補充知識點--【Unity跨平臺的原理】了解.Net

來源于唐老獅的視頻教學&#xff0c;僅作記錄和感悟記錄&#xff0c;方便日后復習或者查找一.什么是.Net.Net是指微軟一整套技術體系的統稱與代號包含的內容有&#xff1a;框架體系&#xff1a;.Net Frameword&#xff0c; .Net Core&#xff0c; Mono開發語言&#xff1a;C#&a…

論文淺嘗 | 提高大型語言模型的數學推理能力的學習定理基本原理(AAAI2025)

筆記整理&#xff1a;蘭雅榕&#xff0c;浙江大學碩士生&#xff0c;研究方向為知識圖譜、大語言模型論文鏈接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/33662發表會議&#xff1a;AAAI 20251. 動機提高開源大型語言模型&#xff08;LLM&#xff09;的數學…

母豬姿態轉換行為識別:計算機視覺與行為識別模型調優指南

母豬姿態轉換行為識別&#xff1a;計算機視覺與行為識別模型調優指南 1. 引言 1.1 研究背景與意義 母豬姿態轉換行為識別是智能養殖領域的重要研究方向&#xff0c;通過計算機視覺技術自動識別母豬的站立、躺臥、行走等姿態變化&#xff0c;對于監測母豬健康狀態、評估福利水平…

K8S集群環境搭建(一)

虛擬機鏡像 ubuntu 24 虛擬機網絡 虛擬網絡–配置 nat模式主機ip配置宿主機ip配置 10.0.0.12 master 2c 10.0.0.15 node1 10.0.0.16 node2 10.0.0.17 node3 10.0.0.20 registersudo vi /etc/netplan/00-installer-config.yaml # 替換為實際文件名 sudo netplan applynetwork:v…

css預編譯器實現星空背景圖

打造夢幻星空背景&#xff1a;用CSS預處理器輕松實現動態效果 星空背景能為網頁增添神秘感和視覺吸引力。通過CSS預處理器&#xff08;如Sass/Less&#xff09;可以高效實現可定制化的星空效果&#xff0c;避免重復編寫純CSS代碼。以下是 Vue3 組件皮膚具體實現方法和代碼示例。…

焊接機器人保護氣體效率優化

在現代工業制造領域&#xff0c;焊接機器人的應用日益廣泛&#xff0c;而保護氣體在焊接過程中起著至關重要的作用。如何優化保護氣體的效率&#xff0c;成為焊接技術發展的一個關鍵考量因素。WGFACS節氣裝置的出現&#xff0c;為焊接機器人在保護氣體效率優化方面帶來了顯著的…

Portkey-AI gateway 的一次“假壓縮頭”翻車的完整排障記:由 httpx 解壓異常引發的根因分析

筆者最近在本地搭建了Portkey AI Gateway&#xff08;模型路由網關&#xff09;&#xff0c;然后按照文檔中的方式進行測試。結果發現&#xff0c;網關能夠接收到請求&#xff0c;但是Python測試的程序卻運行報錯。Python代碼報錯信息如下&#xff1a; Traceback (most recent …

什么是Session? PHP編程中Session用法詳解

一、Session的基本概念 Session 是 Web 開發中用于在服務器端存儲用戶臨時數據的一種機制&#xff0c;它允許服務器在不同的 HTTP 請求之間識別和跟蹤特定用戶的狀態&#xff0c;本質上是?服務器為每個用戶開辟的臨時私有存儲空間?。由于 HTTP 協議本身是無狀態的&#xff…

【大模型】AI平臺 joyagent 2.0 的部署與測試

github鏈接&#xff1a;https://github.com/jd-opensource/joyagent-jdgenie 本篇博客記錄下自己在配置joyagent的過程&#xff0c;以【手動初始化環境&#xff0c;啟動服務】為例&#xff0c;后端調用的deepseek-chat大模型。 前言 JoyAgent是由京東云開源的企業級多智能體系統…

計算機視覺(一):nvidia與cuda介紹

背景與意義 計算機視覺 (Computer Vision, CV) 需要對圖像和視頻進行處理、特征提取和模型訓練&#xff0c;計算量巨大。GPU (圖形處理單元) 擅長并行計算&#xff0c;非常適合深度學習、卷積操作、矩陣乘法等場景。NVIDIA 作為 GPU 領域的領導者&#xff0c;推出了 CUDA (Comp…

阿里云杭州 AI 產品法務崗位信息分享(2025 年 8 月)

&#xff08;注&#xff1a;本崗位信息已獲jobleap.cn授權&#xff0c;可在 CSDN 平臺發布&#xff09; 一、基本信息 招聘方&#xff1a;阿里云工作地點&#xff1a;杭州信息收錄時間&#xff1a;2025 年 08 月 14 日 二、職位主要職責 為 AI 相關產品全流程提供法務支持&…

醫療智慧大屏系統 - Flask + Vue實現

下面我將實現一個完整的醫療智慧大屏系統&#xff0c;使用Flask作為后端框架&#xff0c;前端使用Vue.js結合ECharts進行醫療數據的可視化展示&#xff0c;文章末尾提交源碼下載。 系統設計思路 前端部分&#xff1a; 使用Vue.js構建響應式界面 使用ECharts實現各類醫療數據可…