在上一篇文章,我们讲了,为什么要使用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);
}
}
}
}
Server和Client API及实例代码下载(在Enyim Memcached 1.2.0.2版本上的修改)
下载memcached服务安装地址:http://www.danga.com/memcached/
Client API下载地址:http://www.danga.com/memcached/apis.bml