最近在考慮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,所以我主要基於這個環境來描述。
- 下載:splinedancer上是window版本
- 安裝爲服務:memcached -d install,把memcached安裝爲服務
- 啓動服務:memcached -d start|stop|shutdown|restart
- 配置端口:memcached -p,默認端口爲11211
- 配置內存容量: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
- 下載:Enyim
- 建立項目,引用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>
- 也可以通過工具MemCacheD Manager進行配置和管理
- 使用MemcachedClientMemcachedClient mc = new MemcachedClient(); mc.FlushAll(); // Flush the cache for this example mc.Store(StoreMode.Set, "key1" , object1);
設計的緩存邏輯
如果只是緩存單對象比較簡單,直接在緩存中訪問對象:
- 如果存在,則直接獲取
- 如果不存在,則裝載並緩存
考慮到數據的有效性,對於列表緩存稍微複雜些:
- 如果存在,獲取集合,對集合中每個對象:
- 對象是否在緩存中存在?
- 存在,直接從緩存獲取,更新集合對象
- 不存在,從緩存中刪除集合,進入下一步
- 對象是否在緩存中存在?
- 不存在,裝載集合對象,並緩存集合中的每個對象
對於基於面向對象的應用和基於查詢數據的應用,在C/S的客戶端以及應用服務器和數據庫見的服務端,其緩存機制和設計肯定有自己的方法,我上面的只是一個簡單的思路,不知道有誰有這方面的經驗,分享一下
資源
memcached Storage Engine for MySQL
How to Dramatically Speed Up Your Web Application: An Introduction to memcached
Using memcached: How to scale your website easily
memcached的分佈式算法-Consistent Hashing
另:codeplex上haredCache.com也是一個分佈式緩存服務器,不過我簡單試過,感覺速度慢,可能我哪些參數調得不對,現暫不考慮
歡迎轉載,轉載請註明:轉載自周金根 [ http://zhoujg.cnblogs.com/ ]
評論
#1樓
#2樓
#3樓
#4樓
#5樓
一般來說,C/S中的C在本地可以使用輕量的、簡單的緩存,一般是類庫級別的緩存;S使用的纔是系統級別的緩存。
#6樓