在上一篇文章,我们讲了,为什么要使用memched做为缓存服务器(没看的同学请 )。下面让我们以memcached-1.2.1-win32版本的服务组件(安装后是以一个windows服务做daemon)和 C#API(Enyim.Caching)为基础,做一个"Hello world"级的程序,让我们真正感受到memcached就在我们身边。后一的文章,我们还讲memcached的核心部分(根据key来hash存取 数据,缓存数据在server端的内存存储结构)和一些好的案例。
下面的实例实现的功能很简单,根据key来存取一个object对象(要支持Serializable才行哦),因为服务器端数据都是byte 型的数据组实现存在。
服务的启动:
1, 将memcached-1.2.1-win32.zip解决到指定的地方,如c:\memcached
2, 命令行输入 'c:\memcached\memcached.exe -d install'
3, 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 Memcached,默认监听端口为 11211 可以通过 memcached.exe -h 可以查看其帮助
第一步:配置config文件
<? xml version="1.0" encoding="utf-8" ?> < configuration > < configSections > < sectionGroup name ="enyim.com" > < section name ="memcached" type ="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" /> </ sectionGroup > < section name ="memcached" type ="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" /> </ configSections > < enyim.com > < memcached > < servers > <!-- put your own server(s) here --> < add address ="127.0.0.1" port ="11211" /> </ servers > < socketPool minPoolSize ="10" maxPoolSize ="100" connectionTimeout ="00:00:10" deadTimeout ="00:02:00" /> </ memcached > </ enyim.com > < memcached keyTransformer ="Enyim.Caching.TigerHashTransformer, Enyim.Caching" > < servers > < add address ="127.0.0.1" port ="11211" /> </ servers > < socketPool minPoolSize ="2" maxPoolSize ="100" connectionTimeout ="00:00:10" deadTimeout ="00:02:00" /> </ memcached > </ configuration >
这里的port:11211是, memcached-1.2.1-win32在安装时默认使用的port.当然你可以用memcached.exe -p 端口号来自行设置。
第二步, 新建TestMemcachedApp的console project
引用Enyim.Caching.dll或者在solution中加入这个project(可以下载的代码中找到)。
基础代码如下:
// create a instance of MemcachedClient MemcachedClient mc = new MemcachedClient(); // store a string in the cache mc.Store(StoreMode.Set, " MyKey " , " Hello World " ); // retrieve the item from the cache Console.WriteLine(mc.Get( " MyKey " ));
完整代码如下,
using System; using System.Collections.Generic; using System.Text; using Enyim.Caching; using Enyim.Caching.Memcached; using System.Net; using Enyim.Caching.Configuration; namespace DemoApp { class Program { static void Main( string [] args) { // create a MemcachedClient // in your application you can cache the client in a static variable or just recreate it every time MemcachedClient mc = new MemcachedClient(); // store a string in the cache mc.Store(StoreMode.Set, " MyKey " , " Hello World " ); // retrieve the item from the cache Console.WriteLine(mc.Get( " MyKey " )); // store some other items mc.Store(StoreMode.Set, " D1 " , 1234L ); mc.Store(StoreMode.Set, " D2 " , DateTime.Now); mc.Store(StoreMode.Set, " D3 " , true ); mc.Store(StoreMode.Set, " D4 " , new Product()); mc.Store(StoreMode.Set, " D5 " , new byte [] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }); Console.WriteLine( " D1: {0} " , mc.Get( " D1 " )); Console.WriteLine( " D2: {0} " , mc.Get( " D2 " )); Console.WriteLine( " D3: {0} " , mc.Get( " D3 " )); Console.WriteLine( " D4: {0} " , mc.Get( " D4 " )); byte [] tmp = mc.Get < byte [] > ( " D5 " ); // delete them from the cache mc.Remove( " D1 " ); mc.Remove( " D2 " ); mc.Remove( " D3 " ); mc.Remove( " D4 " ); // add an item which is valid for 10 mins mc.Store(StoreMode.Set, " D4 " , new Product(), new TimeSpan( 0 , 10 , 0 )); Console.ReadLine(); } // objects must be serializable to be able to store them in the cache [Serializable] class Product { public double Price = 1.24 ; public string Name = " Mineral Water " ; public override string ToString() { return String.Format( " Product { { {0}: {1}}} " , this .Name, this .Price); } } } }
(在Enyim Memcached 1.2.0.2版本上的修改)
下载memcached服务安装地址:http://www.danga.com/memcached/
Client API下载地址:http://www.danga.com/memcached/apis.bml