Spring 整合 Memcached 配置(一)

liyongshun82發表於2016-10-11

硬碟和記憶體的作用是什麼

硬碟的作用毫無疑問我們大家都清楚,不就是用來儲存資料檔案的麼?如照片、視訊、各種文件或等等,肯定也有你喜歡的某位島國老師的動作片,這個時候無論我們電腦是否關機重啟它們永遠在那裡,不會無辜地消失掉。那記憶體是用來做什麼的呢?我是不能準確的描述出來,所以我抄襲了下面描述記憶體作用的一段話:

記憶體就是暫時儲存程式以及資料的地方,比如當我們在使用 WPS 處理文稿時,當你在鍵盤上敲入字元時,它就被存入記憶體中,當你選擇存檔時,記憶體中的資料才會被存入硬(磁)盤。

為什麼這麼做?
由於硬碟 IO(讀寫)速度比較慢,CPU 如果執行程式的時候,所有資料都直接從硬碟中讀寫,會非常影響效率。所以, CPU 會將執行軟體時要用的資料一次性從硬碟呼叫到執行速度很快的記憶體,然後, CPU 再與記憶體進行資料交換。記憶體是易失性儲存器,只要你斷了電,記憶體中的資料就沒有了。

我們程式界有沒有「記憶體」呢

當然有。一個簡單的 Web 軟體系統必須包含前端頁面、後端程式、資料庫、伺服器等等這些最基礎的東西,如果我們稍微對系統要求高一點的話,我們發現每次從資料庫讀取資料的時間都有些漫長,這時候的資料庫可以理解為電腦中的硬碟,那我們能不能提高直接從資料庫取資料的效能?或者說減少相同資料的次數。完全沒問題的,因為電腦中有記憶體做這件事,我們程式中也有一種類似的東西叫快取

在程式中快取的實現方式根據不同語言、不同框架我們可以使用的快取系統可以不相同,但是,最後他們要做的事情都是為了提高程式的效能而生的。

如果我們來詳細分一下那就太多了,我們稍微數一下大的分類,如:頁面快取、靜態資源快取、資料庫快取、開發框架快取、記憶體快取系統等等這些大的分類,在這些大類上的具體實現就太多了,我們這裡只討論利用開源的記憶體快取系統構建我們專案幾乎都需要的快取伺服器。

比較常用的快取系統應該就是 Redis 和 Memcached 了吧。這裡不做任何這兩個技術的比較與討論,你只需要根據你使用場景選擇合適自己的就好,或者你並沒有選擇能力的時候,什麼都別說隨便用一個就行。我這裡使用的 Memcached ,請不要問為什麼不用 Redis 。

程式中快取的實現方式

由於我們是基於 Spring 框架下實現快取,我大致把快取在 Spring 下整合的方式分為了三種:

  • 通過客戶端程式碼實現。我稱之為「最原始版」方式
  • 利用 AOP 方式管理。就叫它「升級版」吧
  • 註釋驅動快取方案。Spring 3.1 版本的新特性

要說哪種方式更好,我當然更偏向於註釋驅動快取方案這種方式,因為你需要在你需要快取的方法名上打@Cacheable、@CachePut、@CacheEvict標籤來實現返回資料快取到伺服器。這種方式對程式碼的侵入性是比較小的!這種方式有一個目前我無法解決的問題是:當你方法每次返回的資料都不一樣的時候,你快取命中率會是多少?
也有開源元件simple-spring-memcached也是這種方式,但它的實現原理其實是 AOP 方式來管理,他也是用@ReadThroughSingleCache、@InvalidateSingleCache、@UpdateSingleCache這類的標籤來實現快取,對程式來說也很友好,並且要比 Spring 的方式要更完美一些,但它依然沒有解決我的上述問題。

那麼我要解決的問題是:快取命中率要高、快取資料要儘量少,換句話說就是儘可能少的儲存快取資料並儘可能大的命中快取。

如果解決我這種事兒逼的要求,那隻能自己要實現快取咯。這就是我們上述所說的「最原始版」方式,怎麼理解這種方式,就是自己寫程式碼定義一個快取管理器,呼叫快取客戶端實現快取管理,然後再定義你要快取的 Model 類,接著新增一個這個類的快取實現,就是物件的獲取、增加、修改和刪除,接著就是在你需要獲取資料的時候通過快取獲取,修改資料的時候更新快取,刪除資料的時候刪除快取。這種方式好不好?不好,首先它對程式碼的侵入性已經到了令人髮指的地步,你想想,如果你刪除資料時不小心忘記呼叫刪除快取了,那後果是什麼呢?但是,它唯一好處可能就是比較靈活了吧,可以快取我們想快取的內容,來解決我們上述問題,所以,思來想去最終還是決定採用最原始的方式來實現快取,當然,首先還是要考慮我們怎麼做到快取對程式碼的侵入性,以及我們怎麼更方便或者說不需要改程式碼就實現快取了。

總結一下

這篇文章完全沒有所謂的「乾貨」,整篇都是我關於快取的思考與選擇,如果你堅持看到這裡,那你必有一個錦繡前程。但我認為這個過程很重要,甚至會比寫出程式碼還要重要,所以我選擇記錄下來,大家一起探討。

下一篇 從零開始學 Java - Spring 整合 Memcached 配置(二) 文章會寫關於快取客戶端(Memcached Client for Java、SpyMemcached、XMemcached)的選擇和一些配置及具體程式碼的實現,就是所謂的「乾貨」,如果你有興趣可以去我的 GitHub 上關於 Spring 的示例專案看看:https://github.com/mafly/SpringDemo/tree/memcached

好了,我睡了。



http://blog.mayongfa.cn/

相關文章