[不是工程師] 讓網站速度飛快的秘密,你了解什麼是網頁快取(Cache)嗎?
躲在銀幕後面的強大幫手,用一個便當的時間了解快取機制
提供科技用詞或是功能另外一種理解的方式,
所以很多用詞與邏輯可能不是那麼的嚴謹,還請見諒。
相信逛過電商網站過的你們,一定有一個經驗,在網站進行特賣時,
但是我們都知道,其實網站上有部分的資訊,
要讓網站變快並不是只有一種方法,而且每種方法彼此之前是可以共存的。本篇主要是以降低資料庫使用率為出發。
不過資料庫在網站使用上的問題跟執行緒和資料同步有關。最精簡的講法是,只要資料有同步問題,就無法使用執行緒的優勢,不能同時開兩個程式去修改同一個資料,他們必須要”排隊“依序修改。只要有排隊機制,就等於要等,要等就會花時間。網站裡面的花時間就是網頁讀取變慢。所以減少資料庫的撈取與資料變更是可以有效的讓網站速度變快的其中一種方法。
首先簡單介紹Cache的歷史吧,
這樣的目的主要是為了讓讓資料存取的速度適應CPU的處理速度,
所以Cache是一種概念,
早期很多機器並不像現在記憶體分成很多種,有RAM、有硬碟、有ROM、有SD卡等等,這些全部都可以被稱之為”記憶體“。CPU在讀取資料的時候其實也不知道他對應的是誰,只知道有讀取到資料、對方有回應。但是現在的CPU都超快,所以很可能因為太快了所以會漏掉資料,有點像是CPU點了單,服務生還沒開口講話,就惱羞覺得等太久就走了。因此必須要有個中間人員(裝置),配合CPU的速度,叫他等等,再轉過身跟服務生傳話做動作。
這個裝置叫做記憶體控制器(Memory controller) 或是被包含在早期的北橋晶片(North Bridge chip) 。不過科技是一直在進步的,所以如果是更早期的晶片,其實是連記憶體控制器都沒有的。總之無論是什麼情況,記憶體讀寫速度大致上都比不上CPU的速度,然後記憶體讀寫速度越快,價錢越貴。所以他們就想出了一個方法,讓還沒處理的檔案,放在比較慢比較便宜的記憶體上,處理中的就運行在比較快的記憶體上,這就是我們平常的RAM與硬碟的使用方式。
當要執行程式的時候,先把資料讀到RAM上。在讓CPU與RAM溝通。所以如果RAM不夠的情況下要多執行程式,其實我們是可以運行在硬碟上的。這是虛擬記憶體的其中一種使用方式。但可想而知速度會被拖累很多,這也是為什麼RAM越多電腦跑得越順的原因,因為可以同時處理更多的程式(包含電腦系統)。
不過如果今天在記憶體上所做的事情很大部分都是一樣的事,那我們還要一直處理嗎?
例如
一顆蘋果10元,一根香蕉價錢等於半個蘋果,一個橘子價錢等於2根香蕉。
如果有一本書價值10個橘子,請問是價值多少錢。
一般來說,我們會先把橘子算成錢,也就是1個橘子10元 (10 * 0.5 * 2)。
然後再去乘與10倍。所以是100元。
倘若今天題目改成我想要知道一本價值10個橘子的書與一顆價值5個橘子的球,個別是多少錢。
人類的算法會是先算出上面的100。
再拿5 * 10 = 50,就知道球的價值。
但是電腦不是這樣,因為當算完書以後,電腦因為記憶體寶貴,所以會忘掉原本橘子的價值。
因此會再重算一遍橘子,在算出球。
所以電腦可能會是4個步驟。
1. 算出橘子
2. 算出書
3. 算出橘子
4. 算出球
如果今天又多出其他物品是以橘子計價並且要改成現金計價,那每個金額計算都會重複算出橘子的價錢。
這時你可能會想說,怎麼那麼笨,先把橘子的金額儲存起來就好了啊。
沒錯,這就講對了,而且這就是快取概念的雛形。
當你把橘子的金額儲存起來放到特定的地方,並且每次都去這特定的儲存地點取出這個金額。
這整件事就可以稱之為快取Cache機制,並且當你成功在這特定的儲存地點拿到橘子的金額,就稱作Hit(快取命中)。
而且你會發現這個概念中其實沒有說儲存裝置一定要很快,只是從前面的邏輯來看,如果這個儲存裝置也就是記憶體越快,電腦會跑得越順暢。
所以在早期的時候,快取是容量很小很快的記憶體裝置。並且有個控制器在管理他,要不然他如果存書或是存球的金額,就也只是在浪費空間,沒有被重複利用。這個控制器有可能被放在CPU裡面做套裝,或是一般常見的放在Memory controller旁邊就近管理。而且Cache只是個概念,所以理論上都放也無所謂。想要的話硬碟裝置也可以放一個Cache,網路控制器也可以放,主要是看成本以及效益夠不夠(怕貴也可以用SD卡做快取,只是可能不會變快而已)。
所以回到網路端的快取,能使用的多半只有RAM跟硬碟。而以特性來說,如果快取對象的資料量很大,我們就會放在硬碟裡,也就是會變成實體的檔案。如果資料量比較小,就會放在RAM裡面,畢竟比較快。像MySQL等資料庫,其實多半都有內建類似的機制,只是不叫Cache,比較常見的是名稱是“View”。
不過,快取機制最大的問題就是無法及時刷新,比方上面的例子中,如果算到一半蘋果漲價了,那漲價的時間點之後所有金額都會是錯的。所以如何刷新Cahce資料,什麼時候刷新通常都是Cache與類似Cache機制的最大問題。
當然快取的地位一開始只是用來最佳化系統,
在各個不同的層級實現Cache會需要寫不同的程式,所以程式上可以把它想成不同的事情。利用RAM做作業系統的快取與利用硬碟資料夾空間實踐HTML頁面快取。一個寫個可能是C語言,另外一個可能是PHP、Ruby on rails 或是其他的語言。當然想法可能接近,但是函式庫與語法應該會是完全不一樣。當然,光是在網站運用上面,Client端及Server端的實現也是完全的不一樣。
先從Client端講起,例如像是租房網或是租車網的商品圖。
但網站總有更新的時候吧,總不能一直讓用舊圖吧,因此在HTTP 1.1中就設計了以下兩種機制來達成目的,讓Cache是在 Client 與 Server 之間透過 Header 的「交互作用」機制來完成。所以Cache會用Expire Date和Cache-
但當然除了設計Cache的期限之外,
而Server端的Cache,
Memcached其實就是Memory cache 的意思,Memcache 是一套 Name-Value Pair(NVP) 分散式記憶體快取系統,主要是C語言的架構,概念上就是透過 Memory Cached 使用Key/Value的方式,
而Memcached並非是做在本身的Web server或是DB server等主機上,而是透過使用多台的Server主機做為 Memcached Server的機制,並將這幾台主機變成群組,
簡單來說就是把資料放在RAM裡面做Cache,但是一台主機的RAM是有限的,資料組合的排列組合是將近無限的。
所以用多台主機的RAM合再一起做Cache來解決這個問題,這就是所謂的分散式記憶體快取系統。如果你的網站內容組合很少。單用一台主機RAM就可以達成,那也不一定要”分散式“。
而Redis 也是另外一個常見的Cache方式 ,Redis在Open Source裡面,屬於非常熱門的NOSQL資料庫,
但Memcached也有一些好處,
但畢竟沒有對錯,只有適合與不適合之間的差異落差,
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!