Memcached筆記——(三)Memcached使用總結

y_keven發表於2013-10-29
為了將N個前端資料同步,通過Memcached完成資料打通,但帶來了一些新問題:
  • 使用iBatis整合了Memcached,iBatis針對每臺server生成了唯一標識,導致同一份資料sql會產生不同的key,造成重複快取。——通過重寫iBatis部分原碼,終止了唯一標識的生成,同一個SQL產生同一個Key,同時對生成key做hash,控制長度,使得資料統一在Memcached。
  • 為了迎合iBatis的架構,通過CacheModel模式,對快取資料分組管理。最初通過Map實現CacheModel,就是簡單的Key對應最終的Object。為了後臺運算元據時,前臺能及時響應,以CacheModel為基準點。後臺運算元據時,做Flush,清空對應的CacheModel,可以及時同步資料。但,由於前後臺Domain物件可能不一致,呼叫CacheModel(Map)反序列化時,發生ClassNotFonudException(CNF)。——將CacheModel的Map實現改為Set,CacheModel僅存需要Flush掉的key,Object按原有方式快取。
  • 以前一直用EhCache,也很少會把List<List>這樣的重量級物件放進快取裡。即便如此,只要EhCache沒有拋異常,我們恐怕也無感知。這次改用Memcached,沒有注意到快取List過大,導致“Cannot cache data larger than 1MB memcached”,即快取物件體積不能超過1MB——使用Memcached資料壓縮,優化SQL,可以暫時維持。


相關連結:
Memcached筆記——(一)安裝&常規錯誤&監控
Memcached筆記——(二)XMemcached&Spring整合
Memcached筆記——(三)Memcached使用總結
Memcached筆記——(四)應對高併發攻擊


說了這麼多,簡要總結如下:
  • Memcached的Key,要杜絕使用空格,且長度控制在250個字元。
  • Memcached的Value,要控制體積,必須小於1MB,必要時進行使用壓縮。
  • 失效時間,0為永久有效,最大值不得超過30天(2592000s),否則重新計算可能快取只有1秒
  • Memcached僅支援LRU演算法,完全適用你的需要。
  • 儘量不要將List這種重體積物件扔到Memcached中,傳輸、儲存都會產生瓶頸。
  • 使用一致性雜湊演算法實現,提高多個Memcacehd Server利用率。




關於使用XMemcached實現時,參考如下實現:
Java程式碼 複製程式碼 收藏程式碼
  1. private MemcachedClientBuilder createMemcachedClientBuilder(
  2. Properties properties) {
  3. String addresses = properties.getProperty(ADDRESSES).trim();
  4. if (logger.isInfoEnabled()) {
  5. logger.info("Configure Properties:[addresses = " + addresses + "]");
  6. }
  7. MemcachedClientBuilder builder = new XMemcachedClientBuilder(
  8. AddrUtil.getAddresses(addresses));
  9. // 使用二進位制檔案
  10. builder.setCommandFactory(new BinaryCommandFactory());
  11. // 使用一致性雜湊演算法(Consistent Hash Strategy)
  12. builder.setSessionLocator(new KetamaMemcachedSessionLocator());
  13. // 使用序列化傳輸編碼
  14. builder.setTranscoder(new SerializingTranscoder());
  15. // 進行資料壓縮,大於1KB時進行壓縮
  16. builder.getTranscoder().setCompressionThreshold(1024);
  17. return builder;
  18. }
	private MemcachedClientBuilder createMemcachedClientBuilder(
			Properties properties) {
		String addresses = properties.getProperty(ADDRESSES).trim();

		if (logger.isInfoEnabled()) {
			logger.info("Configure Properties:[addresses = " + addresses + "]");
		}
		MemcachedClientBuilder builder = new XMemcachedClientBuilder(
				AddrUtil.getAddresses(addresses));

		// 使用二進位制檔案
		builder.setCommandFactory(new BinaryCommandFactory());
		// 使用一致性雜湊演算法(Consistent Hash Strategy)
		builder.setSessionLocator(new KetamaMemcachedSessionLocator());
		// 使用序列化傳輸編碼
		builder.setTranscoder(new SerializingTranscoder());
		// 進行資料壓縮,大於1KB時進行壓縮
		builder.getTranscoder().setCompressionThreshold(1024);

		return builder;
	}

主要有以下幾點參考:
  • 使用二進位制檔案模式
  • 使用一致性雜湊演算法
  • 使用序列化編碼
  • 對資料進行壓縮


關於SET&ADD
  • SET&ADD都屬於更新操作,都要先申請記憶體
  • SET,會擦除這個鍵所對應的記憶體,不管原先是否有內容
  • ADD,會先檢視這個鍵對應的記憶體是否有內容,如果有,則等待;若沒有,則獲取鎖,並更新記憶體。



快取命中率,通常認為:快取命中率低於95%的設計都是不合理的,存在設計缺陷的。




這是我線上上伺服器,經過優化後得到的最好成績!

相關連結:
Memcached筆記——(一)安裝&常規錯誤&監控
Memcached筆記——(二)XMemcached&Spring整合
Memcached筆記——(三)Memcached使用總結
Memcached筆記——(四)應對高併發攻擊



Memcached PPT參考
  • 大小: 50.7 KB
  • 大小: 60.4 KB

相關文章