單線程的 Redis,不是快嗎?爲何須要鏈接池?

點擊上方「業餘草」,選擇「置頂公衆號」redis

第一時間獲取技術乾貨和業界資訊!算法


☞ 免費CSDN資料幫下服務 | 免費加羣 ☜數據庫

近一位大佬,工號粉絲好幾萬了。拉了好幾個微信交流羣,我也在其中一個,羣裏大多數人都不說話,說話的都是「紅包」等廣告!服務器

一大早都忙着搶各類紅包,因而,我就在羣裏問了一下你們!單線程的 Redis,不是快嗎?爲何須要鏈接池?有知道的嗎?微信

而後,我就靜靜地等。沒一我的回答問題,多是問題太簡單了吧!惟一的一個網友,回了一個表情:你好過度我必定要截屏發給馬化騰讓他封你號!網絡

這就是我一再強調爲何羣裏不能發廣告的緣由,一發就不可收拾了,就真的成了廣告羣了,沒人交流了!併發

下面,我就這個問題,說一下個人我的理解。app

先說一下,Redis 爲何是單線程的?

由於 CPU 不是 Redis 的瓶頸。Redis 的瓶頸最有多是機器內存或者網絡帶寬。(以上主要來自官方 FAQ)既然單線程容易實現,並且 CPU 不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了。關於 redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求,參見:How fast is Redis?框架

另外,也能夠參考我去年 8 月份的一篇文章《Redis 是單線程結構,但爲什麼單線程還能支持高併發?》。高併發

爲何使用鏈接池?

Redis 是單進程單線程的,它利用隊列技術將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷。

Redis 是基於內存的數據庫,使用以前須要創建鏈接,創建斷開鏈接須要消耗大量的時間。

再假設 Redis 服務器與客戶端分處在異地,雖然基於內存的 Redis 數據庫有着超高的性能,可是底層的網絡通訊卻佔用了一次數據請求的大量時間,由於每次數據交互都須要先創建鏈接,假設一次數據交互總共用時 30ms,超高性能的 Redis 數據庫處理數據所花的時間可能不到 1ms,也便是說前期的鏈接佔用了 29ms,鏈接池則能夠實如今客戶端創建多個鏈接而且不釋放,當須要使用鏈接的時候經過必定的算法獲取已經創建的鏈接,使用完了之後則還給鏈接池,這就免去了數據庫鏈接所佔用的時間。

注意,這行代碼。咱們從 JedisPool 中獲取的僅僅是一個鏈接。至於多個鏈接到達單進程單線程的 Redis 以後怎麼處理,就與你的線程池無關了。

實際上,Redis 在收到多個鏈接後,採用的是非阻塞 IO,基於 epoll 的多路 IO 複用。

而後採用隊列模式將併發訪問變爲串行訪問,對於串行訪問,自己操做內存就很快,Redis 採用一個線程來處理就再正常不過了!

10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智能,GO等等。在公衆號內回覆對應關鍵字或框架名字,便可免費獲取!!

 你再主動一點點   咱們就有故事了

本文分享自微信公衆號 - 業餘草(yyucao)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索