Memcached

  許多Web應用都將數據保存到RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加劇、數據庫響應惡化、網站顯示延遲等重大影響。git

  Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。github

  memcached缺少認證以及安全管制,這表明應該將memcached服務器放置在防火牆後。
 
  memcached的API使用32位元的 循環冗餘校驗(CRC-32)計算鍵值後,將資料分散在不一樣的機器上。當表格滿了之後,接下來新增的資料會以LRU機制替換掉。因爲memcached一般只是看成快取系統使用,因此使用memcached的應用程式在寫回較慢的系統時(像是後端的數據庫)須要額外的程式碼更新memcached內的資料。
 
  爲了提升性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。因爲數據僅存在於內存中,所以重啓memcached、重啓操做系統會致使所有數據消失。另外,內容容量達到指定值以後,就基於LRU(Least Recently Used)算法自動刪除不使用的 緩存。memcached自己是爲緩存而設計的服務器,所以並無過多考慮數據的永久性問題。

(百度百科)算法

 

incr/decr是memcached 1.2.4加入的原子性整數操做(changelog:2006-10-03)。這個功能經常使用於分佈式項目中的計數。數據庫

1. incr/decr在memcached中的保存方式是:字符串(十進制)表示的無符號64bit整數。後端

Increment and Decrement. If an item stored is the string representation of a 64bit integer, you may run incr or decr commands to modify that number. You may only incr by positive values, or decr by positive values. They does not accept negative values.瀏覽器

2. incr/decr操做沒法刷新過時時間。緩存

   memcached的協議能夠看這裏。incr/decr操做沒法刷新過時時間,因此過時時間以初始化的時間爲準。安全

    最開始覺得spy的memcacheClient的incr(String key, int by, long def, int exp)能夠刷新過時時間,後來才發現,此方法是封裝了incr/decr和add的組合操做。這個exp指的是,若incr失敗,則將def值add到此key,並使用這個過時時間exp,若是成功,過時時間不變!服務器

   所以,若是使用memcached做爲長期的計數器,必須用額外的機制定時刷新item。memcached協議提供了touch方法,只刷新時間,不對值做修改,最新的spymemcached 客戶端中提供了這個功能。分佈式

3. 若是對應值不存在,incr/decr會失敗,而不會從0開始計數。

   telnet下輸入:

1
2
incr b 1
NOT_FOUND

   返回NOT_FOUND,沒有incr成功。memcachedClient.incr(key,delta)調用以後,若key不存在,則返回-1。

相關文章
相關標籤/搜索