Redis單線程模型為什么快?

Redis的單線程模型指的是redis只使用一個線程來出來所有的命令式指令,但是不是意味著redis內部就只使用一個線程來處理所有的任務。都知道redis是一個客戶端-服務器的程序,那么redis就只有一個服務器,但是有多個客戶端,就像mysql一樣,mysql也是一個客戶端-服務器程序;

既然redis有多個客戶端,哪有人就會問了:會不會有線程安全問題呢?比如兩個客戶端都同時來修改redis的一個變量,比如都對變量進行+1操作,如果在java中,你使用兩個線程來同時修改一個變量,那就有可能是只加了一次,但是在redis中是不會有線程安全問題的,因為redis是單線程的,同一個時刻只能處理一個命令,其他的命令都得阻塞等待;

redis的單線程有好處也有壞處,好處就是不會出現線程安全問題,那我們日常寫代碼的時候為什么也不就使用單個線程呢?雖然單個線程不會出現線程安全問題,但是執行效率慢呀,但是慢是相比較多線程來說的,一個任務你可以分為10個線程來執行,那你只需要1/10的時間,但是你使用單線程就得多花費9倍的時間;單線程還有一個好處就是沒有線程競爭的開銷,所以會更快一點?有人就要質疑了,一會說redis快,一會說redis慢,那到底是快還是慢呢?這個快和慢都是相比較而言的;回歸主題,為什么redis的單線程模型快呢?

1、redis操作的是內存的,而mysql操作的是硬盤

? ? ? ? 都知道操作內存的速度肯定是比操作硬盤的速度快的,而且快的不是一點點;

2、redis的核心業務更簡單

? ? ? ? redis相比較mysql的增刪查改任務更簡單,mysql的數據的變化都會受到約束,所以就更慢了,redis的邏輯就更簡單了,通常來說redis插入鍵值對受到的約束非常少,受到的約束少就說明開銷更少,速度當然就跟快了;

3、redis的單線程模型沒有線程競爭開銷

? ? ? ? 線程競爭的開銷是很大的,涉及到鎖的創建,鎖的競爭,鎖的釋放等等,單線程模式避免了這樣的競爭開銷了,所以會更快;

4、redis處理網絡IO時,使用epoll這樣的IO多路復用機制

? ? ? ? Linux的IO多路復用機制其實有三種:select,poll,epoll,但是自從3.2開始,redis就堅持使用epoll這樣的機制處理網絡IO;

? ? ? ? 這個機制說來也簡單,redis服務器和客戶端是通過TCP連接通訊的,redis服務器的客戶端可以有很多個,服務器就會對每一個客戶端創建一個socket,而且redis只使用一個線程來管理多個socket。難道一個線程來管理多個socket不會處理不過來嗎?其實redis服務器是處理得過來的,雖然每一個客戶端都分配一個socket,但是不是每一個客戶端都每時每刻跟服務器保持通訊的,有可能連接一分鐘,實際通訊只有100ms,那么其他的時刻其他客戶端就可以和服務器進行通訊,通過這樣的機制就避免了一個socket分配一個線程的開銷,一個線程的開銷不大,但是多個socket,多個線程開銷就很大了;

舉個例子來說明一下:

如果只有我一個人來處理三件事情,事件A-買炒飯、事件B-買水餃、事件C-買煎餅果子,我有三種辦法來處理這件事情,第一種方法就是我先去買炒飯,等炒飯好了我再去買水餃,等水餃好了,我再去買煎餅果子,雖然這樣能完成任務,但是開銷很大,等的時間太長了;

第二種辦法就是:我去買炒飯,再安排兩個人,一個人去買水餃,一個人去買煎餅果子,雖然這樣總的時間變少了,但是使用了三個人,開銷也很大了,這里說的就是一個socket分配一個線程;

第三種辦法就是:我先去買炒飯,讓老板炒好了叫我一聲,在老板炒飯的過程中,我去買水餃,也讓老板水餃煮好了叫我一聲,這個過程我去買煎餅果子,然后我就等,誰好了就叫我一聲我去拿,這樣開銷最,而且效率最高,使用的機制就是epoll的事件通知/回調機制

epoll屬于是操作系統為程序員提供的一種機制,提供了一組API,內部的功能都是操作系統實現;

C\C++使用的及時poll,epoll這樣的機制,而Java使用的是NIO,是標準庫提供了一組類,底層也是封裝了epoll;

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

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

相關文章

前端安全攻防:XSS, CSRF 等常見威脅的防范與檢測指南

在如今高度互聯的 Web 應用世界里,前端安全不再是可有可無的選項,而是構建可信賴、健壯應用的基石。隨著 Web 技術的發展,攻擊者們也變得越來越狡猾,前端遭受的攻擊手段層出不窮。其中,跨站腳本攻擊 (XSS) 和跨站請求偽…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 移除低方差特征(VarianceThreshold)

鋒哥原創的Scikit-learn Python機器學習視頻教程: 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識,包括機器學習概述,特征工程(數據…

C#(鏈表創建與原地反轉)

鏈表創建(C#) 在C#中,鏈表可以通過自定義節點類實現。每個節點包含數據域和指向下一個節點的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源碼導入Android Studio

AOSP代碼量龐大,為了開發的方便,我們需要導入到android studio中,其中關鍵的一 項就是配置跳轉。尤其是對于Framework開發來說生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh會生成如下文件首先需要修改ipr和iml文件…

游戲中的設計模式——第一篇 設計模式簡介

前言 對于設計模式,相信很多開發者并不陌生,我在學習過程中希望把自己的一些總結和心得體會與你分享。 本專欄主要將重點放在設計模式在游戲中的應用,會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多&#xf…

SpringBoot + RustFS 實現文件切片極速上傳技術

本文將手把手教你如何通過 SpringBoot 和 RustFS 構建高性能文件切片上傳系統,解決大文件傳輸的痛點,實現秒傳、斷點續傳和分片上傳等高級功能。 目錄 一、為什么選擇 RustFS SpringBoot? 二、環境準備與部署 2.1 安裝 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切換英文段落大小寫

在Word和WPS文字中編輯英文段落時,有時候英文字母的大小寫不規范,或者需要把某一段全部改為大寫字母怎么辦?使用ShiftF3組合鍵即可快速在三種模式中切換:全部大寫、全部小寫、首字母大寫——其中首字母大寫的Word是每一句話的第一…

成都金牛區哪里租好辦公室?國際數字影像產業園享稅收優惠

在成都金牛區租賃優質辦公室,國際數字影像產業園憑借其享有的稅收優惠政策,成為了許多企業的首選之地。稅收優惠對于租賃辦公室的企業來說,是一筆不小的成本節省。國際數字影像產業園針對入駐企業提供的稅收優惠政策,能在企業運營…

CSS `:is()` `:where()` 實戰指南:簡化選擇器,提升可維護性

🎯 CSS :is() & :where() 實戰指南:簡化選擇器,提升可維護性你是否在項目中寫過一大串重復的選擇器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }這樣的代碼既冗長又難維護。 現在 CSS 提供了 :is() 和…

Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析 目錄 概述I/O 架構層次核心數據結構I/O 處理流程VFS 虛擬文件系統塊設備I/O字符設備I/O內存映射I/O異步I/O機制I/O調度器調試工具與方法性能優化策略 概述 Linux I/O 系統是一個多層次、高度抽象的架構,旨在為應用程序提供統一的文件訪問…

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作,都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現,該方法返回 TableAction 組件來處理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集,這種方式效果良好,但隨著狀態大小的增長超出內存,將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題,引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南 關鍵詞:印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析(核心價值) 印度兩大交易所數據獲取難點: 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相關技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) AFSim介紹 AFSim(Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…

ArcGIS學習-18 實戰-降雨量空間分布插值分析

設置環境加載要素投影查看要素,發現均不是投影數據,但都是地理坐標都是WGS1984使用工具進行批量投影然后新建空地圖,重新加載確認圖層的投影與柵格數據一致插值樣條法得到反距離權重法插值得到克里金法插值得到

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐 引言 隨著HarmonyOS 4.0的發布及后續版本的演進,華為的分布式操作系統已經進入了全新的發展階段。基于API 12及以上的開發環境為開發者提供了更強大、更高效的開發工具和框架。在HarmonyOS應用…

探索Java并發編程--從基礎到高級實踐技巧

Thread(線程)線程 程序執行的最小單位(一個進程至少有一個線程)。線程內有自己的執行棧、程序計數器(PC),但與同進程內其他線程共享堆內存與進程資源 在java中,線程由java.lang.Thr…

Go語言實戰案例-開發一個Markdown轉HTML工具

這個小工具可以把 .md 文件轉換為 .html 文件,非常適合寫筆記、博客或者快速預覽 Markdown 內容。📌 案例目標? 讀取一個 Markdown 文件? 使用開源庫將 Markdown 轉換為 HTML? 將 HTML 輸出到新文件中📦 所需庫我們用 goldmark 這個 Markd…

基于51單片機的太陽能鋰電池充電路燈

基于51單片機的太陽能鋰電池充電路燈系統設計 1 系統功能介紹 本設計以 STC89C52單片機 為核心,構建了一個能夠利用太陽能為鋰電池充電并智能控制LED路燈的系統。系統結合了 光照檢測電路、LED燈電路、按鍵檢測電路、太陽能充電電路 等模塊,實現了節能、…