主流應用架構
- 請求數據在緩存層直接返回
- 緩存層沒有數據則向存儲層(數據庫)穿透查詢
- 數據庫將查詢好的數據回寫給緩存層、方便下次客戶端請求數據時直接從緩存層返回 (回種)
- 將回種的數據返回給客戶端
- 熔斷機制:當存儲層掛掉或者無法提供服務時、可讓客戶端的請求直接打在緩存層上然後直接返回
緩存中間件——Memcache和Redis的區別
-
Memcache
- 支持簡單數據類型
- 不支持數據持久化存儲 服務器宕機之後數據會丟失
- 不支持主從同步
- 不支持分片
-
Redis
- 數據類型豐富 不僅支持簡單的數據類型、還支持list、set、hash等數據的存儲
- 支持數據磁盤持久化存儲
- 支持主從同步
- 支持分片
- 支持數據的備份
Redis快速的原因
100000+QPS(query per second,每秒內查詢次數)
- 完全基於內存、絕大部分請求是純粹的內存操作,執行效率高。
- 數據結構簡單、對數據操作也簡單,redis中的數據結構是專門進行設計的。數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1);
- 採用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因爲可能出現死鎖而導致的性能消耗;
- 使用多路I/O操作模型,非阻塞IO
- 當使用read或write對一個文件描述符進行操作時、如果當前文件描述符不可讀或者不可寫、整個服務就不會對整個操作進行響應
多路I/O複用模型
多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。
這裏“多路”指的是多個網絡連接,“複用”指的是複用同一個線程。採用多路 I/O 複用技術可以讓單個線程高效的處理多個連接請求(儘量減少網絡 IO 的時間消耗),且 Redis 在內存中操作數據的速度非常快,也就是說內存內的操作不會成爲影響Redis性能的瓶頸,主要由以上幾點造就了 Redis 具有很高的吞吐量。