初識Redis · 簡單理解Redis

目錄

前言:

分布式系統

開源節流

認識Redis

負載均衡

緩存

微服務


前言:

本文只是作為Redis的一篇雜談,簡單理解一下Redis為什么要存在,以及它能做到和它不能做到的事兒,簡單提及一下它對應的優勢有什么,不足有什么之類的。

總之,本文只是Redis入門的雜談,咱們看看即可~


分布式系統

首先提到Redis,咱們除了能想到它快之外,還應該能想到分布式系統,即便沒有系統學習過Redis的同學,對于Redis的第一印象大概率就是它能應用在分布式系統上。

那么什么是分布式系統呢?

我們從最簡單的單機架構開始談。

其實到目前為止,挺多公司用的還是單機架構的服務器,什么是單機架構呢?就是上層的應用服務和數據庫服務都是由一個服務器來完成的。那么這個服務器就會面臨一個老生常談的問題,它這個單機服務器面臨大的吞吐量的時候怎么辦?

所以當數據量大起來的時候,一臺單機服務器就沒有辦法處理這么多的數據量,我們就可以引入其他服務器來幫助原來的單機服務器處理多余的數據量。

那么問題來了,我們是將服務器直接通上電,然后就可以直接運行,甚至可以直接處理數據了嗎?顯然并不是。

在引入了多臺主機的情況下,我們勢必面臨的問題是不僅有服務器和服務器之間的連接問題,甚至有了人與人之間的資源調度問題。因為多臺主機,代碼量幾乎是按照指數級增加的,所以前期的代碼開發,到后期的代碼維護,開發人員運維人員的調度明顯是一個問題。

我們從最簡單的分布式開始入手,最開始一臺服務器處理應用服務和數據庫存儲服務,那么我們思考,是否可以將數據庫存儲服務和應用服務分開:

就像這樣,我們就擁有了兩臺主機,一臺是應用服務器的主機,一臺是存儲服務器的主機,一個專門用來處理應用的上層請求,一個專門用來處理數據庫的服務

到現在,最最基本的分布式架構已經出來了,那么我們把數據量往上增加的過程,勢必會有一種煩惱:硬件資源和軟件資源如何增加?

開源節流

到了這個時候,面對非常龐大的數據量的時候,硬件資源反而是最好提升的,因為服務器處理請求的時候,吃的資源無非就是CPU,內存,硬盤,網絡等資源,所以面對硬件資源,我們可以這樣提升:主板上面多插幾塊CPU,多插幾塊內存,硬盤等同理,對于網絡來說我們可以提升網絡帶寬,可以更換網卡,從萬兆網卡更換成千兆網卡。

到這里,我們就簡單理解了開源節流中的開源,即非常簡單粗暴的增加硬件資源,無腦堆就行,但是我們仍然面臨的問題是,主板中的位置是有限的,也就是說硬件資源是沒有辦法無線堆積的,那么有人就說了,堆積主板唄,只能說想法是美好的,畢竟硬件資源最耗費的就是錢財了~~

那么開源的時候預算到了一定程度,沒有辦法了,我們是否應該考慮一下涉及到人工成本的節流?

比如Redis存儲熱點數據的時候,我們使用的是什么數據結構?這樣操作下來時間復雜度是多少?空間復雜度是多少?是否還有更多的空間進行優化?

此時就涉及到了人工的優化了,可是隨著服務器規模的增大,代碼量增大的可不是一點半點,那么人工成本就非常大了,并且改錯了一個bug可能就伴隨著n個Bug。

所以其實從這里就可以看到,分布式并不是一件太完美的事,雖然增加了數據量的處理,但是處理的成本是真的大~~

認識Redis

當我們訪問Redis的官方網站的時候,我們大概率能搜索到以下的關鍵字:in-memory data store, cache, streaming engine, message broker

翻譯過來就就是存儲在內存的數據,緩存,流式引擎,消息隊列。

即我們可以理解為Redis可以做的事兒有以上這么多,當然實際上比這些多多了,不過你說Redis能做這么多,是因為它一發明出來就能做這么多事兒嗎?

顯然不是,最開始Redis的初心只是為了作為消息中間件,即用在消息隊列上面,那么這里就涉及了生產消費模型,最開始人們用了一段時間后,發現Redis好像不止可以用在消息隊列上,比如應用在流式引擎上好像更香。

所以到這里咱們簡單理解呢就是Redis最開始發明出來之后發現應用在其他領域好像也是個香餑餑,也就拿去開發了,不過目前的消息隊列呢很少有直接使用Redis作為中間件的,有很多其他著名的中間件,咱們可以上網搜搜~

咱們拿MySQL和Redis來講,MySQL最大的缺點就是訪問慢,數據量一起來,訪問速度是會有顯著的下降的,而巧了,Redis也可以當作數據庫使用,那么我們是不是就可以把MySQL踢出去,直接使用Redis呢?

顯然不能,MySQL慢是慢了點,但是人家的存儲量比Redis大到哪里去了,那么為什么Redis快呢?因為它是將數據存儲到了內存里面

既然是存儲到了內存里面,那么按照訪問速度金字塔,CPU是最快的,然后是一級緩存二級緩存三級緩存等,最慢的是硬盤,而MySQL讀寫都是在硬盤,Redis讀寫都是在內存,你說這速度差的多不多吧!!

而對于Redis來說,還有一個獨特的點是它可以進行網絡通信,即將自己的內存數據通過網絡發送到其他主機上,這就很強了,不過有的時候也會受限于網絡等問題。咱們學習進程的時候都知道有一個東西叫做進程的隔離性,而對于Redis來說,它能進行進程間通信,即網絡通信,你說它強不強?

好了,我們簡單比較了以下MySQL和Redis的區別之后,我們是否會思考,有沒有存儲量大且速度快的方案?

顯然是有的,我們明顯可以結合MySQL和Redis使用,比如利用二八原則,即百分之20的數據可以滿足百分之80的訪問需求。我們就可以把這百分之20的數據放在Redis里面,到時候直接訪問redis就可以了,要是訪問的不是這20的數據,再訪問MySQL就行。

所以根據上文介紹的分布式系統來說,數據量雖然大,但是總有部分數據是經常訪問的,我們就把這種數據成為熱點數據,其他數據成為冷數據,冷數據咱們就通過MySQL訪問,熱數據我們大多都是通過Redis訪問。

負載均衡

好了,我們現在引入負載均衡的概念了,既然數據量起來了,我們還有多個服務器,那么哪個服務器處理哪個請求呢?最簡單的方式是輪詢,即A服務器處理了第一個那么就B服務器處理第二個,好了,問題來了,誰來完成這個分配的任務呢?

此時,負載均衡就出現了,負載均衡就像是領導,它不處理請求,它要求的是分發每個請求,即把每個請求根據實際情況分發給不同的服務器,這樣就能完成一個削峰填谷的作用。大概率就不能出現某個主機處理的請求太多了導致服務器掛了的情況。

即,負載均衡=領導。

不過既然是領導,既然是要接受所有的請求,雖然不處理,但是仍然是要求負載均衡的接受請求的能力是要大于處理應用服務器的,那么你說會不會數據量大到負載均衡都接受不完的情況?

是非常有可能的,比如雙十一,618的時候,就是數據量大爆發的時候,這個時候就可能要引入更多的負載均衡器了。

緩存

可是你別看數據量這么大的時候只有應用服務器在工作,數據多的時候,數據庫可是真的煩惱,因為幾乎所有的數據都是要從數據庫的這里走的,也就是說數據庫服務器是一個人默默承擔了所有。

那么為了解決問題,根據實際情況出發,我們發現數據庫的讀頻率是遠遠大于寫頻率的,所以我們不妨把數據庫服務器分為主數據庫和從數據庫,一個負責讀取一個負責寫,這樣我們引入了兩臺服務器分別完成讀寫的操作,自然面臨的一個問題就是同步問題

而大多數情況,光把數據庫分為了讀寫數據庫還不夠,因為有的數據非常頻繁的訪問,這就導致了有的時候同步不及時,所以引入了緩存:

即我們將數據庫分為了三個,其中兩個用來讀取,一個是普通的從數據庫,一個是緩存,用來緩存熱點數據,這樣數據庫的壓力一下就下來了。

不過還是那句話,這樣后面的維護成本是比較大的,并且同步問題的難度也是越來越大了。此時咱門的Redis就應用到了緩存服務器里面了。不過這里的從數據庫存放的可都是全量數據。

微服務

不過如果數據量在極端情況下,非常非常多,多到什么程度呢,多到一張表都需要拆分,此時就需要引入微服務了,即我們將數據量拆分了之后,哪個服務器處理哪個庫的哪個表的數據等。

分庫分表

這個時候的代碼量,以及維護難度是大大的提高了,不過能處理數據的程度也確實提升了不少了。

我們在這里就簡單的理解了微服務是什么,即將引入了多臺服務器,不過處理的內容比較單一,比如就一個數據庫的哪個哪個表。不過具體怎么分,那得看實際情況了。

引入微服務,解決了人的問題,付出的代價?
1.系統的性能下降~~(要想保證性能不下降太多,只能引入更多的機器,更多的硬件資源 =>充錢~~)
拆出來更多的服務,多個功能之間要更依賴網絡通信,網絡通信的速度很可能是比硬盤還慢的!!!幸運的是,硬件技術的發展,網卡現在有 萬兆 網卡,讀寫速度已經能過超過硬盤讀寫了~~
2.系統復雜程度提高, 可用性收到影響~~
服務器更多了,出現問題的概率就更大了~~
這就需要一系列的手段,來保證系統的可用性~~
(更豐富的監控報警,以及配套的運維人員)
微服務的優勢:
1.解決了人的資源分配問題.
2.使用微服務, 可以更方便于功能的復用
3.可以給不同的服務進行不同的部署

小結:

在分布式系統中,我們接觸到的名詞有:

應用/系統:即一個服務器程序。
模塊/組件:即一個應用中獨立的功能
分布式:引入多個服務器,每個服務器協同工作
集群:其實就是分布式上的多個主機,不過集群偏邏輯上
主從結構:比如數據庫可以分為主從數據庫,服務器節點也是
中間件:和業務無關的功能,比如消息隊列,數據庫,更多的是為了協助整個服務器工作。
可用性:系統整體可用的時間/總時間
響應時間:肯定是越短越好
吞吐量和并發:一條高速公路,兩個車道,并發量為2,一分鐘過了100輛車,吞吐量為100.


感謝閱讀!

本文主要還是通過分布式系統簡單引入Redis~~所以較為粗糙~~后面會越來越詳細的!!

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

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

相關文章

網絡通訊協議UDP轉發TCP工具_UdpToTcpRelay_雙向版

UDP/TCP網絡轉發器程序說明書 1. 程序概述 本程序是一個高性能網絡數據轉發工具,支持UDP和TCP協議之間的雙向數據轉發,并具備以下核心功能: 協議轉換:實現UDP?TCP協議轉換數據轉換:支持十六進制/ASCII格式的數據轉…

MCP 服務搭建與配置學習資源部分匯總

MCP 服務搭建與配置學習資源匯總 目錄 圖文教程GitHub 示例項目視頻課程不同開發語言實現案例 圖文教程 Cherry Studio 配置 MCP 服務教程 – 介紹如何在 Cherry Studio 客戶端中配置 MCP 服務器,讓 AI 模型能夠自主調用本地/網絡工具來完成任務,提升…

Selenium中`driver.get(htmlfile)`方法可能出現的超時問題

針對Selenium中driver.get(htmlfile)方法可能出現的超時問題,以下是幾種改進方案及具體實現方法: 1. 設置頁面加載超時時間 通過set_page_load_timeout()方法直接控制頁面加載的最大等待時間。若超時,會拋出TimeoutException異常&#xff0c…

20分鐘了解 MMAction2 框架設計

步驟3:構建一個識別器 # 修改此處 predictions[0].pred_score -> predictions[0].pred_scores.item print(Scores of Sample[0], predictions[0].pred_scores.item)步驟4:構建一個評估指標 # 修改此處 data_sample[pred_score].cpu().numpy() ->…

單軌小車懸掛輸送機安全規程

導語 大家好,我是社長,老K。專注分享智能制造和智能倉儲物流等內容。歡迎大家使用我們的倉儲物流技術AI智能體。 新書《智能物流系統構成與技術實踐》 新書《智能倉儲項目出海-英語手冊,必備!》 完整版文件和更多學習資料&#xf…

C++之多態

文章目錄 一、多態的概念 多態的定義與類型 二、多態的實現 三、虛函數 虛函數的概念 虛函數的重寫/覆蓋 協變 析構函數的重寫/覆蓋 override,final關鍵字 override final 純虛函數與抽象類 三個概念辨析 四、多態實現的原理 虛函數表指針 動態綁定與靜態綁定 …

深入理解 HTML5 Audio:網頁音頻播放的新時代

在網頁開發領域,音頻的嵌入和播放一直是一個重要且不斷演進的話題。HTML5 的出現,為網頁音頻播放帶來了標準化的解決方案,極大地改善了開發者和用戶的體驗。 一、HTML5 之前的音頻播放狀況 在 HTML5 誕生之前,互聯網上缺乏統一的網頁音頻播放標準。當時,大多數音頻播放依…

重載和重寫的區別

重載 在同一個類中定義多個同名方法, 但參數列表不同(參數類型、參數個數或參數順序不同)返回值類型不同。 public class MathOperations {int add(int a, int b) {return a b;}double add(double a, double b) {return a b;} }重寫 子…

機器視覺+深度學習,讓電子零部件表面缺陷檢測效率大幅提升

在精密加工的3C電子行業中,一抹0.1毫米的油漬,一粒肉眼難辨的灰塵或將引發整機性能隱患。當制造業邁入微米級品質競爭時代,產品表面看似微不足道的臟污缺陷,正成為制約企業高質量發展的隱形枷鎖。分布無規律的污漬斑點、形態各異的…

Dart逆向之函數調用

我們從Blutter恢復的部分IL中可以看到Dart調用函數的邏輯 // 0x180490: r16 <int> // 0x180490: ldr x16, [PP, #0x8a0] ; [pp0x8a0] TypeArguments: <int> // 0x180494: r30 Instance_MethodChannel // 0x180494: ldr lr, [P…

如何白嫖Grok3 API? 如何使用Grok3 API調用實例?怎么使用Grok3模型?

前段時間&#xff0c;Grok3&#xff08;想要體驗Grok3的童鞋可以參考本文&#xff1a;Grok 上線角色扮演功能&#xff0c;教你課后作業手到擒來&#xff0c;Grok3使用次數限制&#xff1f;如何使用Grok3? Grok3國內支付手段如何訂閱升級Premium - AI is all your need!&#x…

《超短心法》速讀筆記

文章目錄 書籍信息概覽主線行業篇戰法一 人氣漲停戰法戰法二 四維主線戰法 主線龍頭篇戰法三 龍頭起爆戰法戰法四 六合強莊控盤戰法戰法五 籌碼戰法之七星連珠 趨勢牛股篇戰法六 趨勢擒龍之暴漲形態戰法七 趨勢破位起爆戰法戰法八 強中選強多頭戰法 漲停晉級篇戰法九 強勢漲停狙…

git倉庫遷移包括提交記錄日志

網上找了很多資料都不好用&#xff0c;直到看到一個親測有效后&#xff0c;整理如下&#xff1a; 1、進入倉庫目錄下&#xff0c;并且切換到要遷移的分支上 前提是你本地已有舊倉庫的代碼&#xff1b;如果沒有的話&#xff0c;先拉取。 2、更改倉庫地址 git remote set-url …

powerDesign 逆向 mysql 生成 物理模型,并用VBS腳本整理comment

學習自&#xff1a;https://www.cnblogs.com/xmyjcs/p/8536233.html 文章目錄 Reverse Engineer格式化模型執行 VBS 腳本 Reverse Engineer 下面 DBMS 可以通過 ODBC&#xff08;Open Database Connectivity&#xff0c;開放數據庫連接&#xff09;連接&#xff0c; 需要自己先…

Qt文件讀寫

Qt文件讀寫&#xff08;Stream流形式&#xff09; 文件讀寫相關類 1. QFile類 QFile主要用于文件的打開、關閉等功能&#xff1b; [override virtual] bool QFile::open(QIODevice::OpenMode mode);Reimplements: QIODevice::open(QIODevice::OpenMode mode). Opens the fi…

[特殊字符]【高并發實戰】Java Socket + 線程池實現高性能文件上傳服務器(附完整源碼)[特殊字符]

大家好&#xff01;今天給大家分享一個 Java Socket 線程池 實現的高性能文件上傳服務器&#xff0c;支持 多客戶端并發上傳&#xff0c;代碼可直接運行&#xff0c;適合 面試、項目實戰、性能優化 學習&#xff01; &#x1f4cc; 本文亮點&#xff1a; ? 完整可運行代碼&a…

Python proteinflow 庫介紹

ProteinFlow是一個開源的Python庫,旨在簡化蛋白質結構數據在深度學習應用中的預處理過程。以下是其詳細介紹: 功能 數據處理:支持處理單鏈和多鏈蛋白質結構,包括二級結構特征、扭轉角等特征化選項。 數據獲取:能夠從Protein Data Bank (PDB)和Structural Antibody Databa…

WebPages 對象

WebPages 對象 引言 在Web開發領域&#xff0c;WebPages 對象是前端工程師和開發者常用的工具之一。它提供了豐富的API&#xff0c;使我們能夠輕松地與網頁元素進行交互。本文將深入探討WebPages對象的概念、特性以及在實際開發中的應用。 概念 WebPages對象是現代瀏覽器提…

Mysql表的操作(2)

1.去重 select distinct 列名 from 表名 2.查詢時排序 select 列名 from 表名 order by 列名 asc/desc; 不影響數據庫里面的數據 錯誤樣例 &#xff1a; 但結果卻有點出乎意料了~為什么會失敗呢&#xff1f; 其實這是因為書寫的形式不對&#xff0c;如果帶了引號&#xff0c;…

先占個日常,等會寫。

引入一個重要的概念 “struct” &#xff08;譯為中文&#xff1a;結構體&#xff09; 可用作設出比較復雜的一些變量類型 語法 &#xff1a;struct point name { int x; int y; int z;} point 和 name是任意命名的名字&#xff0c;含義是&#xff0c;聲明一個變量類型為st…