單線程的 Redis 快,超快

Redis主要功能-緩存

緩存,是 Redis 最主要的功能了,也是大型網站必備機制,合理地使用緩存不僅可以加 快數據的訪問速度,而且能夠有效地降低後端數據源的壓力。

Redis讀寫速度

官方給出的答案是讀寫速度 10萬/秒,如果說這是在單線程情況下跑出來的成績,你會不會驚訝?為什麼單線程的 Redis 速度這麼快?原因有以下幾點:

  • 純內存操作:Redis 是完全基於內存的,所以讀寫效率非常的高。
  • Redis 存在持久化操作,在持久化操作是都是 fork 子進程和利用 Linux 系統的頁緩存技術來完成,並不會影響 Redis 的性能。
  • 單線程操作:單線程並不是壞事,單線程可以避免了頻繁的上下文切換,頻繁的上下文切換也會影響性能的。
  • 合理高效的數據結構

採用了非阻塞 I/O 多路複用機制:多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

單線程的 Redis 快,超快


多路I/O複用模型原理

  • select函數

會等待,直到描述符句柄中有可用資源(可讀、可寫、異常)時返回,返回值是可用資源(可讀/可寫/異常等)描述符的個數(>0),0代表超時,-1代表錯誤。

具體到內核大致是:當應用程序調用select() 函數, 內核就會相應調用 poll_wait(), 把當前進程添加到相應設備的等待隊列上,然後將該應用程序進程設置為睡眠狀態。直到該設備上的數據可以獲取,然後調用wake_up()喚醒該應用程序進程。select每次輪訓都會遍歷所有描述符句柄。

  • poll 函數

select() 和 poll() 系統調用的本質一樣,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是 poll() 沒有最大文件描述符數量的限制(但是數量過大後性能也是會下降)。poll() 和 select() 同樣存在一個缺點就是,包含大量文件描述符的數組被整體複製於用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著文件描述符數量的增加而線性增大。

單線程的 Redis 快,超快



分享到:


相關文章: