自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

單線程 Redis 如此之快的四個原因

數(shù)據(jù)庫 其他數(shù)據(jù)庫
單線程架構(gòu)是Redis團隊經(jīng)過時間考驗的深思熟慮的選擇。盡管是單線程的,Redis 仍然是性能最高和最常用的內(nèi)存數(shù)據(jù)存儲之一。

?前言

作為內(nèi)存中數(shù)據(jù)存儲,Redis 以其速度和性能著稱,通常被用作大多數(shù)后端服務的緩存解決方案。

但是,在內(nèi)部,Redis 采用單線程架構(gòu)。

為什么單線程設計依然會有這么高的性能?如果利用多線程并發(fā)處理請求不是更好嗎?

在本文中,讓我們深入探討為什么 Redis 才有單線程架構(gòu),依然如此之快,主要從下面4個方面講解。

  • 內(nèi)存數(shù)據(jù)存儲
  • 優(yōu)良的數(shù)據(jù)結(jié)構(gòu)
  • 單線程架構(gòu)
  • 非阻塞IO

讓我們一一剖析。

內(nèi)存數(shù)據(jù)存儲

圖片

訪問 RAM 比磁盤快幾個數(shù)量級

Redis 是一個基于內(nèi)存存儲數(shù)據(jù),也就是上面表的RAM。

Redis 中的每個讀寫操作都等同于從命中 RAM(隨機存取存儲器)的變量中讀取和寫入。

訪問 RAM 比直接訪問磁盤快幾個數(shù)量級,因此,Redis 比其他數(shù)據(jù)存儲快得多。

優(yōu)良的數(shù)據(jù)結(jié)構(gòu)

圖片

作為內(nèi)存中的數(shù)據(jù)存儲,Redis 利用各種底層數(shù)據(jù)結(jié)構(gòu)來高效地存儲數(shù)據(jù),而無需擔心如何將它們持久化到持久存儲中。

例如,Redis 列表是使用鏈表實現(xiàn)的,該鏈表允許在列表的頭部和尾部附近進行恒定時間 O(1) 的插入和刪除。

另一方面,Redis 排序集是通過跳躍列表實現(xiàn)的,它可以實現(xiàn)更快的查詢和插入。

簡而言之,無需擔心持久化數(shù)據(jù),Redis 中的數(shù)據(jù)可以更有效地存儲,以便通過不同的數(shù)據(jù)結(jié)構(gòu)進行快速檢索。

單線程架構(gòu)

圖片

單線程進程

Redis 的寫入和讀取速度極快,CPU 使用率對 Redis 來說從來都不是問題。

根據(jù) Redis 官方文檔,在普通 Linux 系統(tǒng)上運行時,Redis 每秒可以傳遞多達 100 萬個請求。

然而,瓶頸主要來自網(wǎng)絡 I/O。Redis 中的處理時間主要浪費在等待網(wǎng)絡 I/O 上。

雖然多線程架構(gòu)允許應用程序通過上下文切換并發(fā)處理任務,但 Redis 的性能提升是微乎其微的,因為大多數(shù)線程最終會在 I/O 中被阻塞。

通過采用單線程架構(gòu),Redis有下面的幾個好處:

  • 最小化由于線程創(chuàng)建或銷毀引起的 CPU 消耗
  • 最大限度地減少由于上下文切換引起的 CPU 消耗
  • 減少鎖開銷,因為多線程應用程序需要鎖來進行線程同步,這很容易出錯
  • 能夠使用各種“線程不安全”命令,例如 lpush

非阻塞 I/O

圖片

為了處理傳入的請求,服務器需要在套接字上調(diào)用系統(tǒng)調(diào)用以將數(shù)據(jù)從網(wǎng)絡緩沖區(qū)讀取到用戶空間。

這通常是一個阻塞操作,線程被阻塞并且在完全接收到來自客戶端的數(shù)據(jù)之前什么都不做。

為什么我們不在確定套接字中的數(shù)據(jù)已準備好讀取時才調(diào)用系統(tǒng)調(diào)用?

這就是 I/O 多路復用發(fā)揮作用的地方。

I/O 多路復用模塊同時監(jiān)視多個套接字,并且只返回可讀的套接字。

準備好讀取的套接字被推送到單線程事件循環(huán),并由相應的處理程序使用??Reactor Pattern??進行處理。

簡而言之,

  • 由于其阻塞性質(zhì),網(wǎng)絡 I/O 很慢
  • Redis內(nèi)存操作速度快,Redis收到命令后可以快速執(zhí)行

因此,Redis 有意識地做出以下決定:

  • 使用 I/O 多路復用來緩解緩慢的網(wǎng)絡 I/O 問題
  • 使用單線程架構(gòu)減少鎖開銷

總結(jié)

圖片

綜上所述,單線程架構(gòu)是Redis團隊經(jīng)過時間考驗的深思熟慮的選擇。盡管是單線程的,Redis 仍然是性能最高和最常用的內(nèi)存數(shù)據(jù)存儲之一。

責任編輯:武曉燕 來源: JAVA旭陽
相關(guān)推薦

2023-10-15 12:23:10

單線程Redis

2021-05-31 07:44:08

Kafka分布式系統(tǒng)

2019-06-17 14:20:51

Redis數(shù)據(jù)庫Java

2020-11-09 09:33:37

多線程

2024-02-26 00:00:00

JavaScript單線程高效

2023-03-21 08:02:36

Redis6.0IO多線程

2019-04-02 11:20:48

Redis高并發(fā)單線程

2019-02-18 08:10:53

2022-01-04 11:11:32

Redis單線程Reactor

2025-04-24 08:15:00

Redis單線程線程

2025-01-17 08:23:33

2023-06-05 07:57:53

Kafka消息事務消息

2009-07-10 09:05:20

SwingWorker

2019-11-25 10:13:52

Redis單線程I

2024-09-27 11:51:33

Redis多線程單線程

2019-05-07 09:44:45

Redis高并發(fā)模型

2019-07-15 09:09:29

RedisJava操作系統(tǒng)

2020-06-11 09:35:39

Redis單線程Java

2020-10-30 16:20:38

Redis單線程高并發(fā)

2023-08-17 14:12:17

點贊
收藏

51CTO技術(shù)棧公眾號