1、memcached是什麼
Memcached 常被用來加速應用程序的處理,在這裡,我們將著重於介紹將它部署於應用程序和環境中的最佳實踐。這包括應該存儲或不應存儲哪些、如何處理數據的靈活分布以 及如何調節用來更新 memcached 和所存儲數據的方法。所有的應用程序,特別是很多 web 應用程序都需要優化它們訪問客戶機和將信息返回至客戶機的速度。可是,通常,返回的都是相同的信息。從數據源(數據庫或文件系統)加載數據十分低效,若是每次想要訪問該信息時都運行相同的查詢,就尤顯低效。要是能從內存中直接加載這些信息,可想而知速度會快多少倍。
雖然很多 web 服務器都可被配置成使用緩存發回信息,但那與大多數應用程序的動態特性無法相適。而這正是 memcached 的用武之地。它提供了一個通用的內存存儲器,可保存任何東西,包括本地語言的對象,這就讓您可以存儲各種各樣的信息並可以從諸多的應用程序和環境訪問這些 信息。
memcached存儲的是key/value的鍵值對,但是值必須是可序列化的對象(這裡我說的Java),還可以是json,xml,html等,這裡要說明memcached集群,server端之間並不會進行相互的通信,通信完全由你的客戶端來完成,你只需在客戶端規定好你的key值,然後set進行,此時會有一個散列算法,來決定你key會存放在哪台server上。
最後要注意一點,memcached主要使用於存儲實時性要求不是很高的信息。
2、使用memcached的場景
想象有這麼一個場景,一個電子商務網站,在網站的左側是商品的分類,中間是商品搜索結果的列表,可以查看商品信息和商家的基本信息和相關商家的信譽度信息。
在這個場景下,因為一個商場的類別不會經常改變的。實時性不是很高,這樣應該放到緩存中取的。
一般時候做法:
執行一次或者多次sql從數據庫中查詢全站的商品分類---->>遞歸形成你所需的分類tree------>>進入處理數據------->>顯示到頁面上。
在使用 memcached做法:
第一次顯示的時候:判斷memcached緩存中是否有該分類----沒有----->執行一次或者多次sql從數據庫中查詢全站的商品分類----->放到memcached中------->>進入處理數據------->>顯示到頁面
第二次顯示的判斷memcached緩存中是否有該分類----有--->>-從memcached中取出數據-------->>進入處理數據------->>顯示到頁面
當這個過程首次發生時,數據將正常地從數據庫或其他數據源加載,然後再存儲到 memcached 內。當下一次訪問此信息時,它就會從 memcached 中取出,而不是從數據庫加載,節省了時間和 CPU 循環。
但是如果數據中的數據改變怎麼來更新memcached中的數據呢?
過程為:更新數據庫中分類的信息------->找到memcached中key值,刪除------>重新插入到你的memcached中就可以了
memcached 內的存儲操作是原子的,所以信息的更新不會讓客戶機只獲得部分數據;它們獲得的或者是老版本,或者是新版本。
3、在使用memcached中key的約定和命名規范
這裡給大家做一下總結:
第一種:一般都是公司的項目名稱+字符常量+返回PO的id(或者唯一標示都可以)
第二種:可以用spring aop來攔截你要緩存的service,通過類名+方法名+參數名,來做到key值得唯一
第三種:用你的sql語句+id(或者查詢條件)
其中第一種比較靈活你可以嵌入到你service的代碼中,下面寫一段偽代碼:
String key = "taobao"+"cat"+catAll
Object o = getKey(key);
if(o==null){
//查詢你的數據庫操作
cat c = catService.findAll();
setKey(key,c);//set到memcached中
return c;//返回結果
}else{
return (Cat)c;//返回結果
}
但是是嵌入到你service層,就會破壞你service的業務邏輯,耦合性高,這裡我們老大提出了解決方法,就是可以在你service和action中間在加一層來做緩存處理,這樣似乎可以降低耦合。
第二種適用於分模塊開發 ,因為調用的都是同一個類中的方法,但是攔截器也是回影響性能的,但是開發效率會提高的,還有就是不會破壞你的service的業務邏輯。
第三種 個人覺得不是很好 ,因為sql語句要是很長得話,也是會占用一部分內存的。
客戶端語言包括 Java、Perl、PHP 等,都能串行化語言對象以便存儲在 memcached 內,大家可以google一下他的客戶端來做自己的實驗。
4、怎麼有規則彈性的使用memcached(多服務器使用)
提一個問題 ,當memcached的服務器宕掉怎麼辦呢?
這裡要說明的一點就是緩存不是你信息的唯一來源,你不能把memcached當做你的數據庫來使用,他僅僅是一個緩存,一旦宕掉,信息全無,很是可怕。此時你必須保證能從別的地方加載到你數據(如你的MySQL數據庫),有人可能會想到,我可以使用多台server,相互復制彼此的信息,一台宕掉 ,其他的還可以接著使用,我覺得這樣的想法是很糟糕的,假設你使用了三台server 都是1g的內存,你們把信息復制到這三台上,但是你仔細想想,實際上你只擁有1g的內存可用,而你卻浪費了2台server ,這似乎代價很大。
此時你可以這樣解決 ,還是有3台server ,但是這三台server不會擁有相同的信息 ,也就是不會復制信息到對方的server上去,其中一台宕掉的時候,當你在次加載信息的時候,會從數據庫查詢,而這個信息會存儲在其他兩台中的任意一台server上,這樣使用的好處為:同樣式三台server,但是你卻不像第一種那樣,只擁有1g的可用內存,你現在而是3g可用,何樂而不為呢,只是宕掉的時候多查一次庫而已,後面還是會從緩存中獲取。
5、總結
到這裡我想你對memcached也有了些了解,
記住memcached不是一個數據庫,他只是內存,
不是信息的唯一來源,來輔助數據庫操作的,來提升信息的查詢速度。
在開發中怎麼樣規定key,這點很重要,方便以後進行維護。
以及多台server的使用中怎麼才能更有效的利用你的RAM。