成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis的高性能之謎

存儲
Redis是單線程應用程序,這意味著Redis使用單個線程來處理客戶端的請求,Redis具有高性能的原因如下。

介紹

Redis通常用作緩存。當一致性要求不高時,它也可以用作存儲。此外,Redis還提供消息訂閱、事務、索引等功能。我們還可以使用集群功能構建分布式存儲服務,并實現非強一致性的分布式鎖服務。

在上述各種情況下,Redis都具有一個共同的優勢,即處理速度快(高性能)。

Redis有多快?

要了解Redis有多快,您需要有一個評估工具。

幸運的是,Redis提供了這樣一個工具,并提供了一些常用硬件平臺的性能數據。

  • Redis基準測試可用于評估Redis的性能。命令行提供了在正常/管道模式下以及在不同壓力下評估特定命令性能的功能。
  • Redis具有出色的性能。作為鍵值系統,最大負載級別為10W / s,設置和獲取時間消耗級別分別為10ms和5ms。使用流水線可以提高Redis操作的性能。
redis-benchmark -t set,lpush -n 100000 -q
SET: 97087.38 每秒請求 //處理97000次設置請求每秒
LPUSH: 101112.23 每秒請求 //處理100000次lpush請求每秒

腳本執行時間

redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
SCRIPT load redis.call('set','foo','bar'): 101317.12 每秒請求, p50=0.255毫秒

默認情況下,Redis基準測試使用100,000個請求、50個客戶端和3字節的負載進行測試。

Redis為何如此之快?

Redis是單線程應用程序,這意味著Redis使用單個線程來處理客戶端的請求。

Redis具有高性能的原因如下:

  • 內存存儲:Redis使用內存(內存中)存儲,沒有磁盤I/O開銷。
  • 單線程實現:Redis使用單個線程處理請求,避免了多線程之間的線程切換和鎖資源爭用的成本。
  • 非阻塞I/O:Redis使用多路復用I/O技術,在poll、epoll和kqueue中選擇最佳的I/O實現。
  • 優化的數據結構:Redis具有許多經過優化的數據結構實現,可以直接應用。應用層可以直接使用本機數據結構以提高性能。

單線程

Redis的核心網絡模型由單線程實現,這在一開始時曾引起了許多人的困惑。Redis官方對此的回答是:

CPU很少成為Redis的瓶頸,因為通常Redis要么是內存綁定的,要么是網絡綁定的。例如,使用管道在運行在平均Linux系統上的Redis上,每秒可以傳輸甚至100萬個請求,因此,如果您的應用程序主要使用O(N)或O(log(N))命令,它幾乎不會使用太多CPU。

單線程的好處是什么?

  • 無需線程創建或線程銷毀引起的消耗
  • 避免線程切換引起的CPU消耗
  • 避免線程之間的競爭問題,如添加鎖、釋放鎖、死鎖等

此外,單線程機制極大地降低了Redis內部實現的復雜性。哈希的延遲重哈希、Lpush等“線程不安全”命令可以在無鎖的情況下執行。

I/O模型

一般來說,I/O操作分為兩個步驟:

  • 等待數據從網絡到達,然后將其加載到內核空間緩沖區
  • 將數據從內核空間緩沖區復制到用戶空間緩沖區

根據這兩個步驟是否阻塞線程,可以將其分為阻塞/非阻塞、同步/異步。

阻塞I/O模型

I/O最常見的模型是阻塞I/O模型,我們迄今為止在文本中使用的所有示例都使用了阻塞I/O模型。默認情況下,所有套接字都是阻塞的。

在此示例中,我們使用UDP而不是TCP,因為對于UDP,數據“準備”以供讀取的概念很簡單:要么接收到整個數據報,要么沒有。

而對于TCP,情況會更加復雜,因為還涉及到額外的變量,如套接字的低水位標記等。

非阻塞I/O模型

當我們將套接字設置為非阻塞時,我們告訴內核“當我請求的I/O操作不能在不使進程進入休眠的情況下完成時,請不要使進程進入休眠,而是返回一個錯誤”。

前三次調用recvfrom時,沒有數據返回,因此內核立即返回EWOULDBLOCK錯誤。第四次調用recvfrom時,數據報準備好了,它

被復制到我們的應用程序緩沖區中,recvfrom成功返回。然后我們處理數據。

當應用程序循環調用非阻塞描述符上的recvfrom時,這稱為輪詢。應用程序不斷輪詢內核,以查看某個操作是否準備好。這通常會浪費CPU時間,但通常在專用于一項功能的系統上遇到這種模型。

多路復用I/O模型

使用I/O多路復用時,我們調用select或poll并在這兩個系統調用中的一個中阻塞,而不是在實際I/O系統調用中阻塞。

我們在調用select中阻塞,等待數據報套接字可讀。當select返回套接字可讀時,我們然后調用recvfrom將數據報復制到我們的應用程序緩沖區中。

與阻塞I/O相比,使用select似乎沒有任何優勢,實際上,由于使用select需要兩個系統調用而不是一個,因此實際上存在輕微的劣勢。

但使用select的優勢在于,我們可以等待多個描述符準備就緒。

現在讓我們看看Redis如何處理客戶端連接?

通常,Redis使用反應器設計模式,封裝了多個實現(select、epoll、kqueue等)以多路復用IO來處理來自客戶端的請求。

反應器設計模式通常用于實現事件驅動。此外,Redis在不同平臺上封裝了不同的多路復用IO庫。

Redis將優先選擇時間復雜度為O(1)的I/O多路復用函數作為底層實現,包括Solaris 10中的evport、Linux中的epoll和Mac OS / FreeBSD中的kqueue。

這些函數都使用內核的內部結構,并可以為數十萬個文件描述符提供服務。

但是,如果當前的編譯環境沒有上述函數,將選擇select作為備選方案。因為在使用時會掃描所有受監視的描述符,所以其時間復雜度較差O(n),同時一次只能為1024個文件描述符提供服務,因此通常不作為首選方案使用。

責任編輯:趙寧寧 來源: 小技術君
相關推薦

2025-04-10 08:05:00

Netty線程池代碼

2021-07-04 14:20:16

Redis中間件高性能

2024-04-17 08:35:04

Lua腳本Redis數據結構

2015-03-13 19:34:41

2019-06-12 15:20:25

Redis高性能線程

2024-07-12 08:42:58

Redis高性能架構

2017-04-17 06:07:01

React Nativ開發性能

2024-09-25 16:10:05

2017-05-03 11:43:51

Redis數據庫

2009-11-16 10:56:20

多業務路由器

2017-07-20 09:36:39

高性能存儲Z-NAND

2021-08-13 09:06:52

Go高性能優化

2014-11-25 10:03:42

JavaScript

2012-12-17 13:51:22

Web前端JavaScriptJS

2019-10-17 09:23:49

Kafka高性能架構

2022-06-30 08:04:16

Redis分布式鎖Redisson

2024-09-06 07:55:42

2019-03-01 11:03:22

Lustre高性能計算

2025-06-27 10:41:04

Redis數據庫集群
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区在线日韩在线深爱 | 国产精品日韩欧美一区二区三区 | 91中文在线观看 | 亚洲精品中文在线观看 | 亚洲一区二区国产 | 日韩在线成人 | 日日噜噜噜夜夜爽爽狠狠视频, | a级片www | 国产人成精品一区二区三 | 国产ts人妖一区二区三区 | 亚洲成人久久久 | 一区二区三区四区在线视频 | 日韩中文在线视频 | 在线播放国产一区二区三区 | 亚洲一区二区三区在线 | 国产精品日产欧美久久久久 | 久久9999久久| 夜夜操天天艹 | a免费视频| 国产精品视频www | 国产精品久久久久aaaa樱花 | 欧美做暖暖视频 | 91精品国产综合久久香蕉922 | 在线观看不卡av | 91精品国产91久久久久福利 | 偷拍自拍第一页 | 国产精品亚洲第一 | 日本小电影在线 | 久久久久久亚洲精品 | 日韩av在线一区 | 日韩性在线 | 雨宫琴音一区二区在线 | 成人精品鲁一区一区二区 | 欧美精品一区二区三区在线播放 | 男人的天堂中文字幕 | 免费精品国产 | 成人小视频在线观看 | 欧美激情一区二区 | 精品久久国产老人久久综合 | 久久久精品欧美 | 夜夜骑av|