主頁 > 資料庫 > 詳解redis網路IO模型

詳解redis網路IO模型

2022-12-10 07:26:15 資料庫

前言

"redis是單執行緒的" 這句話我們耳熟能詳,但它有一定的前提,redis整個服務不可能只用到一個執行緒完成所有作業,它還有持久化、key過期洗掉、集群管理等其它模塊,redis會通過fork子行程或開啟額外的執行緒去處理,所謂的單執行緒是指從網路連接(accept) -> 讀取請求內容(read) -> 執行命令 -> 回應內容(write),這整個程序是由一個執行緒完成的,至于為什么redis要設計為單執行緒,主要有以下原因:

  1. 基于記憶體,redis命令操作主要都是基于記憶體,這已經足夠快,不需要借助多執行緒,
  2. 高效的資料結構,redis底層提供了動態簡單動態字串(SDS)、跳表(skiplist)、壓縮串列(ziplist)等資料結構來高效訪問資料,
  3. 保持簡單,引入多執行緒會使redis變得復雜,例如需要考慮多執行緒并發訪問資源競爭問題,資料結構也會變得復雜,hash就不能是單純的hash,需要像java一樣設計一個ConcurrentHashMap,還需要考慮執行緒切換帶來的性能損耗,基于第一點,當程式執行已經足夠快,多執行緒并不能帶來正面收益,

按照redis官方介紹,單個節點的redis qps可以達到10w+,已經非常優秀,如果有更高的要求,則可以通過部署主從、集群方式進一步提升,
單執行緒不是沒有缺點的,我們需要辯證的看待問題,不然所有的組件都可以使用redis替代了,首先是基于記憶體的操作有丟失資料的風險,盡管你可以配置appendfsync always每次將執行請求通過aof檔案持久化,但這也會帶來性能的下降,另外單執行緒的執行意味著所有的請求都需要排隊執行,如果有一個命令阻塞了,其它命令也都執行不了,可以與之比較的是mysql,如果有一條sql陳述句執行比較慢,只要它不完全拖垮資料庫,其它請求的sql陳述句還是可以執行,最后,從上面可以看到從接收網路連接到寫回回應內容,對于網路請求部分的處理其實是可以多執行緒執行來提升網路IO效率的,

redis 6.0
從redis 6.0開始,網路連接(accept) -> 讀取請求內容(read) -> 執行命令 -> 回應內容(write) 這個程序中的“執行命令”這個步驟依然保持單執行緒執行,而對于網路IO讀寫是多執行緒執行的了,原因是這部分是網路IO的決議、回應處理,已經不是單純的記憶體操作,可以充分利用多核CPU的優勢提升性能,對于這部分的性能需求其實一直都存在,社區也有KeyDB這樣的產品,其核心就是在redis的基礎上對多執行緒的支持,這多redis來說無疑是一種挑戰,所有redis6.0開始在網路IO處理支持多執行緒就顯得非常必要了,

我們知道redis客戶端連接是可以有很多個的,最多可以有maxclients引數配置的數量,默認是10000個,那么redis是如何高效處理這么多連接的呢?以及6.0和之前的版本是如何具體處理從接收連接到回應整個程序的,或者說redis執行緒模型是怎么樣的,清楚的了解這些有助于我們更好的學習redis,其中的知識在以后學習其它中間件也可以很好的借鑒,

linux IO模型

在學習redis網路IO模型之前我們必須先了解一下linux的IO模型,以為redis也是基于作業系統去設計的,I/O是Input/Output的縮寫,是指作業系統與外部設備進行讀取、輸出的互動程序,外部設備可以是網卡、磁盤等,作業系統一般都分為內核和用戶空間兩部分,內核負責與底層硬體互動,用戶程式讀寫資料都需要經過內核空間,也就是資料會不斷的在內核-用戶空間進行復制,不同的IO模型在這個復制程序用戶執行緒有不同的表現,有的是阻塞,有的是非阻塞,有的是同步,有的是異步,

以linux為例,常見的IO模型有阻塞IO、非阻塞IO、IO多路復用、信號驅動IO、異步IO 5種,這次我們主要關注前3個,重點是IO多路復用,另外兩個在使用上有一些局限性,實際應用并不多,這5種IO模型我們在這一篇已經有詳細的介紹,這里簡單再復習一遍,

以一個最簡單例子,現在有兩個客戶端需要連接、發送資料到我們的服務端,看下服務端在各種IO模型下是如何接收、讀取請求的,

阻塞IO(Blocking IO)

假設服務端只開啟一個執行緒處理請求,第一個請求到來,開始呼叫內核read函式,然后就會發生阻塞,第二個請求到來時服務端將無法處理,只能等第一個請求讀取完成,這種方式的缺點很明顯,每次只能處理一個請求,無法發揮cpu多核優勢,性能低下,

為了解決這個問題,我們可以引入多執行緒,這樣就可以同時處理多個請求了,但服務端可能同時有成千上萬的請求需要處理,隨之而來的是執行緒數膨脹,頻繁創建、銷毀執行緒帶來的性能影響,當然我們可以使用執行緒池,但服務能處理的總體數量就會受限于執行緒池執行緒數量,

非阻塞IO(NON-Blocking IO)

相比阻塞IO,非阻塞IO會立即回傳,呼叫者不會阻塞,此時可以做一些其它事情,例如處理其它請求,但是非阻塞IO需要主動輪詢是否有資料需要處理,且這種輪詢需要從用戶態切換到內核態這,假如沒有資料產生就會有很多空輪詢,白白浪費cpu資源,

阻塞IO、非阻塞IO,要么需要開啟更多執行緒去處理IO,要么需要從用戶態切換到內核態輪詢IO事件,那么有沒有一種機制,用戶程式只需要將請求提交給內核,由內核用少量的執行緒去監聽,有事件就通知用戶程式呢?這就是IO多路復用,

IO多路復用(IO Multiplexing)

IO多路復用機制是指一個執行緒處理多個IO流,多路是指網路連接,復用指的是同一個執行緒,
如果簡單從圖上看IO多路復用相比阻塞IO似乎并沒有什么高明之處,假設服務只處理少量的連接,那么相比阻塞IO確實沒有太大的提升,但如果連接數非常多,差距就會立竿見影,
首先IO多路復用會提交一批需要監聽的檔案句柄(socket也是一種檔案句柄)到內核,由內核開啟一個執行緒負責監聽,把輪詢作業交給內核,當有事件發生時,由內核通知用戶程式,這不需要用戶程式開啟更多的執行緒去處理連接,也不需要用戶程式切換到內核態去輪詢,用一個執行緒就能處理大量網路IO請求,
redis底層采用的就是IO多路復用模型,實際上基本所有中間件在處理網路IO這一塊都會使用到IO多路復用,如kafka,rocketmq等,所以本次學習之后對其它中間件的理解也是很有幫助的,

select/poll/epoll
這三個函式是實作linux io多路復用的內核函式,我們簡單了解下,

linux最開始提供的是select函式,方法如下:

select(int nfds, fd_set *r, fd_set *w, fd_set *e, struct timeval *timeout)

該方法需要傳遞3個集合,r,e,w分別表示讀、寫、例外事件集合,集合型別是bitmap,通過0/1表示該位置的fd(檔案描述符,socket也是其中一種)是否關心對應讀、寫、例外事件,例如我們對fd為1和2的讀事件關心,r引數的第1,2個bit就設定為1,

用戶行程呼叫select函式將關心的事件傳遞給內核系統,然后就會阻塞,直到傳遞的事件至少有一個發生時,方法呼叫會回傳,內核回傳時,同樣把發生的事件用這3個引數回傳回來,如r引數第1個bit為1表示fd為1的發生讀事件,第2個bit依然為0,表示fd為2的沒有發生讀事件,用戶行程呼叫時傳遞關心的事件,內核回傳時回傳發生的事件,

select存在的問題:

  1. 大小有限制,為1024,由于每次select函式呼叫都需要在用戶空間和內核空間傳遞這些引數,為了提升拷貝效率,linux限制最大為1024,
  2. 這3個集合有相應事件觸發時,會被內核修改,所以每次呼叫select方法都需要重新設定這3個集合的內容,
  3. 當有事件觸發select方法回傳,需要遍歷集合才能找到就緒的檔案描述符,例如傳1024個讀事件,只有一個讀事件發生,需要遍歷1024個才能找到這一個,
  4. 同樣在內核級別,每次需要遍歷集合查看有哪些事件發生,效率低下,

poll函式對select函式做了一些改進

poll(struct pollfd *fds, int nfds, int timeout)

struct pollfd {
	int fd;
	short events;
	short revents;
}

poll函式需要傳一個pollfd結構陣列,其中fd表示檔案描述符,events表示關心的事件,revents表示發生的事件,當有事件發生時,內核通過這個引數回傳回來,

poll相比select的改進:

  1. 傳不固定大小的陣列,沒有1024的限制了(問題1)
  2. 將關心的事件和實際發生的事件分開,不需要每次都重新設定引數(問題2),例如poll陣列傳1024個fd和事件,實際只有一個事件發生,那么只需要重置一下這個fd的revent即可,而select需要重置1024個bit,

poll沒有解決select的問題3和4,另外,雖然poll沒有1024個大小的限制,但每次依然需要在用戶和內核空間傳輸這些內容,數量大時效率依然較低,

這幾個問題的根本實際很簡單,核心問題是select/poll方法對于內核來說是無狀態的,內核不會保存用戶呼叫傳遞的資料,所以每次都是全量在用戶和內核空間來回拷貝,如果呼叫時傳給內核就保存起來,有新增檔案描述符需要關注就再次呼叫增量添加,有事件觸發時就只回傳對應的檔案描述符,那么問題就迎刃而解了,這就是epoll做的事情,

epoll對應3個方法

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epoll_create負責創建一個背景關系,用于存盤資料,底層是用紅黑樹,以后的操作就都在這個背景關系上進行,
epoll_ctl負責將檔案描述和所關心的事件注冊到背景關系,
epoll_wait用于等待事件的發生,當有有事件觸發,就只回傳對應的檔案描述符了,

reactor模式

前面我們介紹的IO多路復用是作業系統的底層實作,借助IO多路復用我們實作了一個執行緒就可以處理大量網路IO請求,那么接收到這些請求后該如何高效的回應,這就是reactor要關注的事情,reactor模式是基于事件的一種設計模式,在reactor中分為3中角色:
Reactor:負責監聽和分發事件
Acceptor:負責處理連接事件
Handler:負責處理請求,讀取資料,寫回資料

從執行緒角度出發,reactor又可以分為單reactor單執行緒,單reactor多執行緒,多reactor多執行緒3種,

單reactor單執行緒

處理程序:reactor負責監聽連接事件,當有連接到來時,通過acceptor處理連接,得到建立好的socket物件,reactor監聽scoket物件的讀寫事件,讀寫事件觸發時,交由handler處理,handler負責讀取請求內容,處理請求內容,回應資料,
可以看到這種模式比較簡單,讀取請求資料,處理請求內容,回應資料都是在一個執行緒內完成的,如果整個程序回應都比較快,可以獲得比較好的結果,缺點是請求都在一個執行緒內完成,無法發揮多核cpu的優勢,如果處理請求內容這一塊比較慢,就會影響整體性能,

單reactor多執行緒

既然處理請求這里可能由性能問題,那么這里可以開啟一個執行緒池來處理,這就是單reactor多執行緒模式,請求連接、讀寫還是由主執行緒負責,處理請求內容交由執行緒池處理,相比之下,多執行緒模式可以利用cpu多核的優勢,單仔細思考這里依然有性能優化的點,就是對于請求的讀寫這里依然是在主執行緒完成的,如果這里也可以多執行緒,那效率就可以進一步提升,

多reactor多執行緒

多reactor多執行緒下,mainReactor接收到請求交由acceptor處理后,mainReactor不再讀取、寫回網路資料,直接將請求交給subReactor執行緒池處理,這樣讀取、寫回資料多個請求之間也可以并發執行了,

redis網路IO模型

redis網路IO模型底層使用IO多路復用,通過reactor模式實作的,在redis 6.0以前屬于單reactor單執行緒模式,如圖:

在linux下,IO多路復用程式使用epoll實作,負責監聽服務端連接、socket的讀取、寫入事件,然后將事件丟到事件佇列,由事件分發器對事件進行分發,事件分發器會根據事件型別,分發給對應的事件處理器進行處理,我們以一個get key簡單命令為例,一次完整的請求如下:


請求首先要建立TCP連接(TCP3次握手),程序如下:
redis服務啟動,主執行緒運行,監聽指定的埠,將連接事件系結命令應答處理器,
客戶端請求建立連接,連接事件觸發,IO多路復用程式將連接事件丟入事件佇列,事件分發器將連接事件交由命令應答處理器處理,
命令應答處理器創建socket物件,將ae_readable事件和命令請求處理器關聯,交由IO多路復用程式監聽,

連接建立后,就開始執行get key請求了,如下:

客戶端發送get key命令,socket接收到資料變成可讀,IO多路復用程式監聽到可讀事件,將讀事件丟到事件佇列,由事件分發器分發給上一步系結的命令請求處理器執行,
命令請求處理器接收到資料后,對資料進行決議,執行get命令,從記憶體查詢到key對應的資料,并將ae_writeable寫事件和回應處理器關聯起來,交由IO多路復用程式監聽,
客戶端準備好接收資料,命令請求處理器產生ae_writeable事件,IO多路復用程式監聽到寫事件,將寫事件丟到事件佇列,由事件分發器發給命令回應處理器進行處理,
命令回應處理器將資料寫回socket回傳給客戶端,

reids 6.0以前網路IO的讀寫和請求的處理都在一個執行緒完成,盡管redis在請求處理基于記憶體處理很快,不會稱為系統瓶頸,但隨著請求數的增加,網路讀寫這一塊存在優化空間,所以redis 6.0開始對網路IO讀寫提供多執行緒支持,需要知道的是,redis 6.0對多執行緒的默認是不開啟的,可以通過 io-threads 4 引數開啟對網路寫資料多執行緒支持,如果對于讀也要開啟多執行緒需要額外設定 io-threads-do-reads yes 引數,該引數默認是no,因為redis認為對于讀開啟多執行緒幫助不大,但如果你通過壓測后發現有明顯幫助,則可以開啟,

redis 6.0多執行緒模型思想上類似單reactor多執行緒和多reactor多執行緒,但不完全一樣,這兩者handler對于邏輯處理這一塊都是使用執行緒池,而redis命令執行依舊保持單執行緒,如下:

可以看到對于網路的讀寫都是提交給執行緒池去執行,充分利用了cpu多核優勢,這樣主執行緒可以繼續處理其它請求了,
開啟多執行緒后多redis進行壓測結果可以參考這里,如下圖可以看到,對于簡單命令qps可以達到20w左右,相比單執行緒有一倍的提升,性能提升效果明顯,對于生產環境如果大家使用了新版本的redis,現在7.0也出來了,建議開啟多執行緒,

總結

本篇我們學習redis單執行緒具體是如何單執行緒以及在不同版本的區別,通過網路IO模型知道IO多路復用如何用一個執行緒處理監聽多個網路請求,并詳細了解3種reactor模型,這是在IO多路復用基礎上的一種設計模式,最后學習了redis單執行緒、多執行緒版本是如何基于reactor模型處理請求,其中IO多路復用和reactor模型在許多中間件都有使用到,后續再接觸到就不陌生了,

歡迎關注我的github:https://github.com/jmilktea/jtea

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/539692.html

標籤:其他

上一篇:一鍵部署MySQL8+keepalived雙主熱備高可用

下一篇:大資料 - DWD&DIM 行為資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more