2014-12-03 138 views
3

我知道這是一個非常普遍的問題。但是,我想了解允許Redis(或像MemCached,Cassandra這樣的緩存)在驚人的性能極限下工作的主要架構決策。Redis如何實現高吞吐量和高性能?

  1. 連接如何維護?
  2. 連接是TCP還是HTTP?
  3. 我知道它完全用C語言編寫。內存如何管理?
  4. 什麼是同步技術用於實現高吞吐量,儘管 競爭性讀/寫?

基本上,簡單的香草實現的機器與內存緩存和服務器,可以響應命令和Redis框之間的區別是什麼?我也明白答案需要非常大,並且應該包含非常複雜的完成細節。但是,我所尋找的是一些通用的技術,而不是所有的細微差別。

+1

小尼特,卡桑德拉不是一個緩存,它是一個數據庫。 – RussS 2014-12-03 17:24:07

回答

6

Redis文檔中有大量信息用於瞭解其工作原理。現在,回答具體的問題:

1)如何保持連接?

使用ae事件循環(由Redis作者設計)來維護和管理連接。所有的網絡I/O操作都是非阻塞的。您可以使用平臺的最佳網絡I/O解複用機制(epoll for Linux,kqueue for BSD等),將libe看作極簡主義實現,就像libevent,libev,libuv等一樣...

2)連接TCP或HTTP?

連接是TCP使用Redis協議,這是一個簡單的Telnet兼容,面向文本protocol支持二進制數據。該協議通常比HTTP更高效。

3)如何管理內存?

內存通過依賴通用內存分配器進行管理。在某些平臺上,這實際上是系統內存分配器。在其他一些平臺(包括Linux)上,jemalloc已被選中,因爲它在CPU消耗,併發支持,碎片和內存佔用之間提供了良好的平衡。 jemalloc源代碼是Redis發行版的一部分。

與其他產品(如memcached)相反,在Redis中沒有實現slab分配器。

在通用分配器之上實現了一些optimized data structures以減少內存佔用量。

4)什麼是同步技術用於實現高吞吐量,儘管競爭讀/寫?

Redis是一個單線程事件循環,所以沒有要完成的同步,因爲所有的命令都是序列化的。現在,一些線程也出於內部目的在後臺運行。在極少數情況下,它們訪問由主線程管理的數據,使用經典的pthread同步原語(例如互斥體)。但代表多個客戶端連接進行的數據訪問100%不需要任何同步。

你可以發現有更多的信息: Redis is single-threaded, then how does it do concurrent I/O?

是什麼一個普通實現一機多用之間在內存中緩存和服務器,可以將命令和Redis的盒子迴應區別?

沒有區別。 Redis是一個普通的香草機器,它具有內存緩存和可以響應命令的服務器。但是,這是做了正確的實現:使用單線程事件循環模型

  • 使用其相應的使用情況
  • 優化的簡單主義的數據結構,提供了一組經過精心挑選,以平衡命令

    • 極簡主義和實用性
    • 不斷將最好的原始性能
    • 很好地適應現代操作系統機制
    • 提供多種持久性機制becau如果「一種尺碼適合所有人」的做法只是一個夢想。
    • 提供用於HA的機制的構建塊(例如複製系統)
    • 避免堆疊起來像煎餅
    • 導致乾淨的和可以理解的代碼庫,任何好的C顯影劑舒服帶
    無用抽象層