緩存 - 使用Memcached

 最近在考慮OpenExpressApp中的緩存如何實現?目前的一個項目,是一個廣域網應用,滿足集團和一個子公司應用。由於產品是一個主要基於數據的應用,操作上仍舊需要類似C/S的操作,希望大數據量的操作,目前基於我在家測試的長城寬帶(2M)可以滿足應用,但是仍舊滿足不了C/S觀念的人,所以還是需要一些緩存的技術,否則很多操作仍舊需要訪問服務器也的確不好。考慮到主要是基於兩個公司使用,不是傳統的Web廣域網應用,所以會考慮在客戶端也部署分佈式緩存應用。

  目前分佈式緩存中,memcached相對來說比較成熟,所以花了半天看了一本memcached的書,進行了一些大概地瞭解,以便看看是否可以使用。由於只是初步瞭解,本篇我將對memcached進行簡單的介紹,希望對不熟悉的人也有所幫助,同時也非常希望高人能夠多多指教。

memcached是什麼

  memcached是一個高性能的分佈式基於Name Value Pairs (NVPs) 的緩存系統,不處理數據持久和安全機制。它是一個開源的免費系統,容易部署安裝,簡單而又不缺強大。

  它由兩部分組成:server和client。memcached server做的就是通過一個Key(不能超過250個字符採用object:key:type命名)值來存儲和獲取數據(1M)。緩存應用時可以部署多個服務器,每個服務器是自治的。client支持多種語言,目前已經存在很多語言的API。  

安裝 memcached Server

  memcached適用於多平臺和多語言,而我使用的環境是Window和.Net,所以我主要基於這個環境來描述。

  1. 下載:splinedancer上是window版本
  2. 安裝爲服務:memcached -d install,把memcached安裝爲服務
  3. 啓動服務:memcached -d  start|stop|shutdown|restart
  4. 配置端口:memcached -p,默認端口爲11211
  5. 配置內存容量:memcached -m,默認端口爲64M

memcached 1.2.0
-p <num>            port number to listen on
-s <file>               unix socket path to listen on (disables network support)
-l <ip_addr>        interface to listen on, default is INDRR_ANY
-d                          run as a daemon
-r                           maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>          max memory to use for items in megabytes, default is 64 MB
-M                         return error on memory exhausted (rather than removing items)
-c <num>            max simultaneous connections, default is 1024
-k                          lock down all paged memory
-v                          verbose (print errors/warnings while in event loop)
-vv                        very verbose (also print client commands/reponses)
-h                         print this help and exit
-i                          print memcached and libevent license
-b                         run a managed instanced (mnemonic: buckets)
-P <file>             save PID in <file>, only used with -d option
-f <factor>          chunk size growth factor, default 1.25
-n <bytes>         minimum space allocated for key+value+flags, default 48

使用.Net client API

  前面說個memcached支持多種語言的client API,每種語言也可能有多個不同版本,這裏講一下《Using Memached》書中介紹的一個在codeplex上發佈的Enyim

  1. 下載:Enyim
  2. 建立項目,引用dll後,配置App.Config文件
    複製代碼
    <configuration> <configsections> <sectiongroup name="enyim.com"> <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection,Enyim.Caching"/> </sectiongroup> <enyim.com> <memcached> <servers> <!-- put your own server(s) here--> <add address="127.0.0.1" port="11211"> <add address="127.0.0.1" port="11212">         </servers> <socketpool minpoolsize="10" maxpoolsize="100" connectiontimeout="00:10:00" deadtimeout="00:02:00"/> </memcached> </enyim.com> </configsections> </configuration>
    複製代碼
  3. 也可以通過工具MemCacheD Manager進行配置和管理
  4. 使用MemcachedClient
    MemcachedClient mc = new MemcachedClient(); mc.FlushAll(); // Flush the cache for this example mc.Store(StoreMode.Set, "key1" , object1);

     


 設計的緩存邏輯

  如果只是緩存單對象比較簡單,直接在緩存中訪問對象:

  1. 如果存在,則直接獲取
  2. 如果不存在,則裝載並緩存

  考慮到數據的有效性,對於列表緩存稍微複雜些:

  • 如果存在,獲取集合,對集合中每個對象:
    • 對象是否在緩存中存在?
      • 存在,直接從緩存獲取,更新集合對象
      • 不存在,從緩存中刪除集合,進入下一步
  • 不存在,裝載集合對象,並緩存集合中的每個對象

對於基於面向對象的應用和基於查詢數據的應用,在C/S的客戶端以及應用服務器和數據庫見的服務端,其緩存機制和設計肯定有自己的方法,我上面的只是一個簡單的思路,不知道有誰有這方面的經驗,分享一下

資源

官方網站

FAQ

memcached Storage Engine for MySQL

memcachedb

Windows version of memcached

libevent

memcache二進制協議

 如何監控memcached

memcached for small project

How to Dramatically Speed Up Your Web Application: An Introduction to memcached

Memcached深度分析

Memcache的使用和協議分析詳解

Using memcached: How to scale your website easily

memcached完全剖析–1. memcached的基礎

memcached的分佈式算法-Consistent Hashing

應用 memcached 提升站點性能

 

另:codeplex上haredCache.com也是一個分佈式緩存服務器,不過我簡單試過,感覺速度慢,可能我哪些參數調得不對,現暫不考慮

 

歡迎轉載,轉載請註明:轉載自周金根 [ http://zhoujg.cnblogs.com/ ]

分類: 架構
2
0
(請您對文章做出評價)
« 上一篇:個人管理 - 如何閱讀一本書
» 下一篇:開源 - WPF報表引擎

posted on 2009-12-17 23:03 周 金根 閱讀(...) 評論(7編輯 收藏

評論

#1樓   

不錯,總結的很詳細。
2009-12-18 02:47 | 深山老林  

#2樓   

我的c/s程序也要加載好多數據,速度好慢,不知道這個適合嗎
2009-12-18 08:35 | net1234  

#3樓   

CS在客戶端加載,不需要緩存吧。
2009-12-18 09:22 | 巫雲  

#4樓   

我的cs客戶端連的是託管服務器 每次加載大量數據的時候很慢,樓主說這個能適用嗎?
2009-12-18 10:05 | HaHa001[未註冊用戶]

#5樓   

@net1234
一般來說,C/S中的C在本地可以使用輕量的、簡單的緩存,一般是類庫級別的緩存;S使用的纔是系統級別的緩存。
2009-12-18 10:12 | 不死鳥之魂  

#6樓   

收藏了。如果數據傳輸比較慢的話,推薦使用服務端先壓縮,然後再傳輸,到客戶端解壓的方式。大大提高效率。廣域網性能往往都是網絡傳輸時降低的。我現在的產品都是這麼處理的。包括程序的升級,都是先壓縮後,再發布的,客戶端升級時自動解壓。
發佈了14 篇原創文章 · 獲贊 22 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章