對memcached使用的總結和使用場景

一、memcached是什麼 html

Memcached 常被用來加速應用程序的處理,在這裏,咱們將着重於介紹將它部署於應用程序和環境中的最佳實踐。這包括應該存儲或不該存儲哪些、如何處理數據的靈活分佈以 及如何調節用來更新 memcached 和所存儲數據的方法。全部的應用程序,特別是不少 web 應用程序都須要優化它們訪問客戶機和將信息返回至客戶機的速度。但是,一般,返回的都是相同的信息。從數據源(數據庫或文件系統)加載數據十分低效,如果 每次想要訪問該信息時都運行相同的查詢,就尤顯低效。要是能從內存中直接加載這些信息,可想而知速度會快多少倍。
雖然不少 web 服務器均可被配置成使用緩存發回信息,但那與大多數應用程序的動態特性沒法相適。而這正是 memcached 的用武之地。它提供了一個通用的內存存儲器,可保存任何東西,包括本地語言的對象,這就讓您能夠存儲各類各樣的信息並能夠從諸多的應用程序和環境訪問這些 信息。 java

memcached存儲的是key/value的鍵值對,可是值必須是可序列化的對象(這裏我說的java),還能夠是json,xml,html 等,這裏要說明memcached集羣,server端之間並不會進行相互的通訊,通訊徹底由你的客戶端來完成,你只需在客戶端規定好你的key值,而後 set進行,此時會有一個散列算法,來決定你key會存放在哪臺server上。 mysql

最後要注意一點,memcached主要使用於存儲實時性要求不是很高的信息。 web

二、使用memcached的場景 算法

想象有這麼一個場景,一個電子商務網站,在網站的左側會是商品的分類,中間是商品搜索結果的列表,能夠查看商品信息和商家的基本信息和相關商家的信譽度信息。 spring

在這個場景下,由於一個商場的類別不會常常改變的。實時性不是很高,這樣應該放到緩存中取的。 sql

通常時候作法: 數據庫

執行一次或者屢次sql從數據庫中查詢全站的商品分類---->>遞歸造成你所需的分類tree------>>進入處理數據------->>顯示到頁面上。 json

在使用 memcached作法: 緩存

第一次顯示的時候:判斷memcached緩存中是否有該分類----沒有----->執行一次或者屢次sql從數據庫中查詢全站的商品分類 ----->放到memcached中------->>進入處理數據------->>顯示到頁面

第二次顯示的判斷memcached緩存中是否有該分類----有--->>-從memcached中取出數據-------->>進入處理數據------->>顯示到頁面

 當這個過程首次發生時,數據將正常地從數據庫或其餘數據源加載,而後再存儲到 memcached 內。當下一次訪問此信息時,它就會從 memcached 中取出,而不是從數據庫加載,節省了時間和 CPU 循環。

可是要是數據中的數據改變怎麼來更新memcached中的數據呢

過程爲:更新數據庫中分類的信息------->找到memcached中key值,刪除------>從新插入到你的memcached中就能夠了

memcached 內的存儲操做是原子的,因此信息的更新不會讓客戶機只得到部分數據;它們得到的或者是老版本,或者是新版本。

三、在使用memcached中key的約定和命名規範

這裏給你們作一下總結:

第一種:通常都是公司的項目名稱+字符常量+返回PO的id(或者惟一標示均可以)

第二種:能夠用spring aop來攔截你要緩存的service,經過類名+方法名+參數名,來作到key值得惟一

第三種:用你的sql語句+id(或者查詢條件)

其中第一種比較靈活你能夠嵌入到你service的代碼中,下面寫一段僞代碼:

  1. String key = "taobao"+"cat"+catAll  
  2. Object o = getKey(key);  
  3. if(o==null){  
  4.     //查詢你的數據庫操做  
  5.    cat  c = catService.findAll();  
  6.   setKey(key,c);//set到memcached中  
  7.   return c;//返回結果  
  8. }else{  
  9.   return (Cat)c;//返回結果  
  10. }  
可是是嵌入到你service層,就會破壞你service的業務邏輯,耦合性高,這裏咱們老大提出瞭解決方法,就是能夠在你service和action中間在加一層來作緩存處理,這樣彷佛能夠下降耦合。
第二種適用於分模塊開發 ,由於調用的都是同一個類中的方法,可是攔截器也是回影響性能的,可是開發效率會提升的,還有就是不會破壞你的service的業務邏輯。

第三種 我的以爲不是很好 ,由於sql語句要是很長得話,也是會佔用一部份內存的。

客戶端語言包括 Java、Perl、PHP 等,都能串行化語言對象以便存儲在 memcached 內,你們能夠google一下他的客戶端來作本身的實驗。

四、怎麼有規則彈性的使用memcached(多服務器使用)

提一個問題 ,當memcached的服務器宕掉怎麼辦呢?

這裏要說明的一點就是緩存不是你信息的惟一來源,你不能把memcached當作你的數據庫來使用,他僅僅是一個緩存,一旦宕掉,信息全無,非常可 怕。此時你必須保證能從別的地方加載到你數據(如你的mysql數據庫),有人可能會想到,我可使用多臺server,相互複製彼此的信息,一臺宕掉 ,其餘的還能夠接着使用,我以爲這樣的想法是很糟糕的,假設你使用了三臺server 都是1g的內存,大家把信息複製到這三臺上,可是你仔細想一想,實際上你只擁有1g的內存可用,而你卻浪費了2臺server ,這彷佛代價很大。

此時你能夠這樣解決 ,仍是有3臺server ,可是這三臺server不會擁有相同的信息 ,也就是不會複製信息到對方的server上去,其中一臺宕掉的時候,當你在次加載信息的時候,會從數據庫查詢,而這個信息會存儲在其餘兩臺中的任意一臺 server上,這樣使用的好處爲:一樣式三臺server,可是你卻不像第一種那樣,只擁有1g的可用內存,你如今而是3g可用,何樂而不爲呢大笑,只是宕掉的時候多查一次庫而已,後面仍是會從緩存中獲取。

五、總結

到這裏我想你對memcached也有了些瞭解,

記住memcached不是一個數據庫,他只是內存,

不是信息的惟一來源,來輔助數據庫操做的,來提高信息的查詢速度。

在開發中怎麼樣規定key,這點很重要,方便之後進行維護。

以及多臺server的使用中怎麼才能更有效的利用你的RAM。

相關文章
相關標籤/搜索