1. 程式人生 > >為什麼說Redis單執行緒效率高

為什麼說Redis單執行緒效率高

Redis效率高的主要原因有下面幾個:

  • 基於記憶體操作,速度非常快
  • 採用單執行緒,避免了上下文的切換導致消耗CPU
  • 採用單執行緒,不用去考慮各種加鎖釋放鎖的問題
  • 使用IO多路複用模型,非阻塞IO

Redis採用的是基於記憶體的採用的是單程序單執行緒模型的 KV 資料庫,由C語言編寫,官方提供的資料是可以達到100000+的QPS(每秒內查詢次數)。

這個資料不比採用單程序多執行緒的同樣基於記憶體的 KV 資料庫 Memcached 差!
Redis
上圖是Redis官方的測試資料,橫軸表示連線數,縱軸表示QPS。

如果Redis採用的是多執行緒,那麼CPU會在多個執行緒之間來回切換,在如此高的QPS下,多個執行緒的切換時特別頻繁的,十分消耗CPU。

假設我們有三個連線同時執行下面的操作:

incr count

由於Redis使用單執行緒來處理命令的,所以一條命令來了之後不會立即執行,而是將命令加到一個佇列中,然後逐個被執行,這樣就能保證在不加鎖的情況下保證不會產生併發問題。

如果Redis採用多執行緒執行命令,那麼對於三個連線同時執行incr操作的時候,就需要新增鎖來保證執行緒的安全性了,會大大降低執行效率。

Redis採用非阻塞IO,使用epoll作為IO多路複用技術的實現,再加上Redis自身的樹鹼處理模型將epoll中的連線、讀寫、關閉都轉為事件,不在網路IO上浪費過多的事件。

當然了,單執行緒機制也不是萬能的,也會存在一個的問題:對於每個命令的執行事件是有要求的。如果某個命令執行事件過長,會導致其他命令被阻塞,對於Redis這種高效能的服務來說是致命的。

所以即使Redis效能很高,我們也要合理的去使用Redis,不合理的使用也會導致很多問題。

喜歡這篇文章的朋友,歡迎掃描下圖關注公眾號lebronchen,第一時間收到更新內容。
這裡寫圖片描述

相關推薦

為什麼說Redis執行效率

Redis效率高的主要原因有下面幾個: 基於記憶體操作,速度非常快 採用單執行緒,避免了上下文的切換導致消耗CPU 採用單執行緒,不用去考慮各種加鎖釋放鎖的問題 使用IO多路複用模型,非阻塞IO Redis採用的是基於記憶體的採用的是單程序單執行緒模型的

《【面試突擊】— Redis篇》-- Redis執行模型瞭解嗎?為啥執行效率還這麼

能堅持別人不能堅持的,才能擁有別人未曾擁有的。關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!! 《【面試突擊】— Redis篇》-- Redis的執行緒模型瞭解嗎?為啥單執行緒效率還這麼高? 在這個系列裡,我會整理一些面試題與大家分享,幫助年後和我一樣想要在金三銀四準備

Redis執行的原因

一、前言 近乎所有與Java相關的面試都會問到快取的問題,基礎一點的會問到什麼是“二八定律”、什麼是“熱資料和冷資料” ,複雜一點的會問到快取雪崩、快取穿透、快取預熱、快取更新、快取降級等問題,這些看似不常見的概念,都與我們的快取伺服器相關,一般常用的快取伺服器有Redis、Memcached等

Redis執行理解

簡介 從接觸Redis到現在,一直被它的單執行緒問題困擾,這對於一個苛求原理的我來說是種折磨,今天吃飯途中看了幾篇部落格,茅塞頓開。 個人理解         redis分客戶端和服務端,一次完整的redis請求事件

Nodejs探祕:深入理解執行實現併發原理

前言 從Node.js進入我們的視野時,我們所知道的它就由這些關鍵字組成 事件驅動、非阻塞I/O、高效、輕量,它在官網中也是這麼描述自己的: Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript e

redis執行處理,以及執行的優缺點

Redis快的主要原因是: 完全基於記憶體 資料結構簡單,對資料操作也簡單 使用多路 I/O 複用模型 單程序單執行緒好處 程式碼更清晰,處理邏輯更簡單 不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗 不存在

redis執行模型分析

redis原理 redis採用自己實現的事件分離器,效率比較高,內部採用非阻塞的執行方式,吞吐能力比較大。 不過,因為一般的記憶體操作都是簡單存取操作,執行緒佔用時間相對較短,主要問題在io上,因此,redis這種模型是合適的,但是如果某一個執行緒出現問題導致執行緒佔用很長時間,那麼reids的單

Redis執行為何速度如此之快

Redis之所以執行速度很快,主要依賴於以下幾個原因: (一)純記憶體操作,避免大量訪問資料庫,減少直接讀取磁碟資料,redis 將資料儲存在記憶體裡面,讀寫資料的時候都不會受到硬碟 I/O 速度的限制,所以速度快; (二)單執行緒操作,避免了不必要的上下文切換和競爭條件

關於redis執行的分析

redis為什麼那麼快?結論有三點,大家都知道,這裡主要是分析。 首先第一點 redis是記憶體訪問的,所以快 當然這個大家都知道,所以不是重點   io密集型和cpu密集型 一般我們把任務分為io密集型和cpu密集型   io密集型 IO密集型指的是系統的CPU效能相對硬碟、記憶體要

程序執行Redis如何能夠併發

1、基本原理 採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路IO的時間消耗) (1)為什麼不採用多程序或多執行緒處理?多執行緒處理可能涉及到鎖 多執行緒處理會涉及到執行緒切換而消耗CPU(2)單執行緒處理的缺點?無法發揮多核CPU效能,不過可以

執行Redis效能為何如此之

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。 實際專案開發中現在無法逃避的一個問題就是快取問題,而快取問題也是面試必問知識點之一,如果面試官好一點可能會簡單的問你二八定律或者熱資料和冷資料,但是如果問的深入一點可能就會問到快取更新、降級、預熱、雪崩、穿透等問題,

Redis執行模型

Redis客戶端對服務端的每次呼叫都經歷了傳送命令,執行命令,返回結果三個過程。其中執行命令階段,由於Redis是單執行緒來處理命令的,所有每一條到達服務端的命令不會立刻執行,所有的命令都會進入一個佇列中,然後逐個被執行。並且多個客戶端傳送的命令的執行順序是不確定的。但是可以確定的是不會有兩條命

執行併發的情況下操作redis當中的資料,如何加鎖?

多個執行緒同時去操作Redis當中的資料,假如不加鎖的情況下,會出現資料重複的問題。假如需要每次都只有一條執行緒去操作Redis當中的資料,需要給操作加上鎖。     但是去網上一搜,網上給Redis加鎖的機制都是利用Redis的setnx自身的方法去加鎖,但是這樣

Redis面試題(一): Redis到底是多執行還是執行

0. redis單執行緒問題     單執行緒指的是網路請求模組使用了一個執行緒(所以不需考慮併發安全性),即一個執行緒處理所有網路請求,其他模組仍用了多個執行緒。   1

Redis執行的,為什麼這麼快?

近乎所有與Java相關的面試都會問到快取的問題,基礎一點的會問到什麼是“二八定律”、什麼是“熱資料和冷資料”,複雜一點的會問到快取雪崩、快取穿透、快取預熱、快取更新、快取降級等問題,這些看似不常見的概念,都與我們的快取伺服器相關,一般常用的快取伺服器有Redis、Memcached等,而筆者目前最常

nodejs 執行 併發

nodejs為什麼是單執行緒且支援高併發的指令碼語言呢? 1.node的優點:I/O密集型處理(node的I/O請求都是非同步的,如:sql查詢、檔案流操作、http請求……);非同步I/O? 顧名思義就是非同步的發出I/O請求 2.node的缺點:不擅長cpu密集型的操作(因為nodejs是單執行緒的)

為什麼說Redis執行的以及Redis為什麼這麼快?

一、前言 近乎所有與Java相關的面試都會問到快取的問題,基礎一點的會問到什麼是“二八定律”、什麼是“熱資料和冷資料”,複雜一點的會問到快取雪崩、快取穿透、快取預熱、快取更新、快取降級等問題,這些看似不常見的概念,都與我們的快取伺服器相關,一般常用的快取伺服器有Redis、Memcached等,而筆者目

Redis核心技術---執行

以前一直有個誤區,以為:高效能伺服器 一定是 多執行緒來實現的 原因很簡單因為誤區二導致的: 多執行緒 一定比 單執行緒 效率高。其實不然。 redis 核心就是 如果我的資料全都在記憶體裡,我單執行緒的去操作 就是效率最高的,為什麼呢,因為多執行緒的本質就是 CPU 模擬出來多個

Redis執行

一、前言 近乎所有與Java相關的面試都會問到快取的問題,基礎一點的會問到什麼是“二八定律”、什麼是“熱資料和冷資料” ,複雜一點的會問到快取雪崩、快取穿透、快取預熱、快取更新、快取降級等問題,這些看似不常見的概念,都與我們的快取伺服器相關,一般常用的快取伺服器有Redis、Memcached等

Python中執行、多執行和多程序的效率對比實驗

Python是執行在直譯器中的語言,查詢資料知道,python中有一個全域性鎖(GIL),在使用多程序(Thread)的情況下,不能發揮多核的優勢。而使用多程序(Multiprocess),則可以發揮多核的優勢真正地提高效率。 對比實驗 資料顯示,如果多執行緒的程序是CPU密集型的,那多執行緒並不能有多少