缘起: 在数据驱动
![](/icons/11405de.gif)
web开发中
![](/icons/11405dou.gif)
经常要重复从数据库中取出相同
![](/icons/11405de.gif)
数据
![](/icons/11405dou.gif)
这种重复极大
![](/icons/11405de.gif)
增加了数据库负载
![](/icons/11405dou2.gif)
缓存Cache是解决这个问题
![](/icons/11405de.gif)
好办法
![](/icons/11405dou2.gif)
但是ASP.NET中
![](/icons/11405de.gif)
虽然已经可以实现对页面局部进行缓存Cache
![](/icons/11405dou.gif)
但还是不够灵活
![](/icons/11405dou2.gif)
此时Memcached或许是你想要
![](/icons/11405de.gif)
![](/icons/11405dou2.gif)
Memcached是什么?
Memcached是由Danga Interactive开发
![](/icons/11405de.gif)
![](/icons/11405dou.gif)
高性能
![](/icons/11405de.gif)
![](/icons/11405dou.gif)
分布式
![](/icons/11405de.gif)
内存对象缓存Cache系统
![](/icons/11405dou.gif)
用于在动态应用中减少数据库负载
![](/icons/11405dou.gif)
提升访问速度
![](/icons/11405dou2.gif)
Memcached能缓存Cache什么?
通过在内存里维护
![](/icons/11405yi.gif)
个统
![](/icons/11405yi.gif)
![](/icons/11405de.gif)
巨大
![](/icons/11405de.gif)
hash表
![](/icons/11405dou.gif)
Memcached能够用来存储各种格式
![](/icons/11405de.gif)
数据
![](/icons/11405dou.gif)
包括图像、视频、文件以及数据库检索
![](/icons/11405de.gif)
结果等
![](/icons/11405dou2.gif)
Memcached快么?
非常快
![](/icons/11405dou2.gif)
Memcached使用了libevent(如果可以
![](/icons/11405de.gif)
话
![](/icons/11405dou.gif)
在linux下使用epoll)来均衡任何数量
![](/icons/11405de.gif)
打开链接
![](/icons/11405dou.gif)
使用非阻塞
![](/icons/11405de.gif)
网络I/O
![](/icons/11405dou.gif)
对内部对象实现引用计数(因此
![](/icons/11405dou.gif)
针对多样
![](/icons/11405de.gif)
客户端
![](/icons/11405dou.gif)
对象可以处在多样
![](/icons/11405de.gif)
状态)
![](/icons/11405dou.gif)
使用自己
![](/icons/11405de.gif)
页块分配器和哈希表
![](/icons/11405dou.gif)
因此虚拟内存不会产生碎片并且虚拟内存分配
![](/icons/11405de.gif)
时间复杂度可以保证为O(1).
![](/icons/11405dou2.gif)
Danga Interactive为提升Danga Interactive
![](/icons/11405de.gif)
速度研发了Memcached
![](/icons/11405dou2.gif)
目前
![](/icons/11405dou.gif)
LiveJournal.com每天已经在向
![](/icons/11405yi.gif)
百万用户提供多达两千万次
![](/icons/11405de.gif)
页面访问
![](/icons/11405dou2.gif)
而这些
![](/icons/11405dou.gif)
是由
![](/icons/11405yi.gif)
个由web服务器和数据库服务器组成
![](/icons/11405de.gif)
集群完成
![](/icons/11405de.gif)
![](/icons/11405dou2.gif)
Memcached几乎完全放弃了任何数据都从数据库读取
![](/icons/11405de.gif)
方式
![](/icons/11405dou.gif)
同时
![](/icons/11405dou.gif)
它还缩短了用户查看页面
![](/icons/11405de.gif)
速度、更好
![](/icons/11405de.gif)
资源分配方式
![](/icons/11405dou.gif)
以及Memcache失效时对数据库
![](/icons/11405de.gif)
访问速度
![](/icons/11405dou2.gif)
Memcached
![](/icons/11405de.gif)
特点
Memcached
![](/icons/11405de.gif)
缓存Cache是
![](/icons/11405yi.gif)
种分布式
![](/icons/11405de.gif)
![](/icons/11405dou.gif)
可以让区别主机上
![](/icons/11405de.gif)
多个用户同时访问
![](/icons/11405dou.gif)
因此解决了共享内存只能单机应用
![](/icons/11405de.gif)
局限
![](/icons/11405dou.gif)
更不会出现使用数据库做类似事情
![](/icons/11405de.gif)
时候
![](/icons/11405dou.gif)
磁盘开销和阻塞
![](/icons/11405de.gif)
发生
![](/icons/11405dou2.gif)
Memcached
![](/icons/11405de.gif)
使用
![](/icons/11405yi.gif)
Memcached服务器端
![](/icons/11405de.gif)
安装 (此处将其作为系统服务安装)
下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
1 解压缩文件到c:memcached
2命令行输入 'c:memcachedmemcached.exe -d
![](/icons/11405install.gif)
'
3 命令行输入 'c:memcachedmemcached.exe -d start'
![](/icons/11405dou.gif)
该命令启动 Memcached
![](/icons/11405dou.gif)
默认监听端口为 11211
通过 memcached.exe -h 可以查看其帮助
2 .NET memcached client library
下载文件:http://sourceforge.net/projects/memcacheddotnet/
里面有.net1.1 和 .net2.0
![](/icons/11405de.gif)
两种版本 还有
![](/icons/11405yi.gif)
个不错
![](/icons/11405de.gif)
例子
![](/icons/11405dou2.gif)
3 应用
1 将Commons.dll
![](/icons/11405dou.gif)
ICSharpCode.SharpZipLib.dll
![](/icons/11405dou.gif)
log4net.dll
![](/icons/11405dou.gif)
Memcached.ClientLibrary.dll 等放到bin目录
2 引用Memcached.ClientLibrary.dll
3 代码
1
Memcached.MemcachedBench
2{
3 using
;
4 using
.Collections;
5
6 usingMemcached.ClientLibrary;
7
8 public
MemcachedBench
9 {
10 [STAThread]
11 public
voidMain(String
args)
12 {
13 ![](/icons/11405string.gif)
serverlist={"10.0.0.131:11211","10.0.0.132:11211"};
14
15 //
化池
16 SockIOPoolpool=SockIOPool.GetInstance
;
17 pool.SetServers(serverlist);
18
19 pool.InitConnections=3;
20 pool.MinConnections=3;
21 pool.MaxConnections=5;
22
23 pool.SocketConnectTimeout=1000;
24 pool.SocketTimeout=3000;
25
26 pool.Ma
enanceSleep=30;
27 pool.Failover=true;
28
29 pool.Nagle=false;
30 pool.Initialize
;
31
32 //获得客户端例子
33 MemcachedClientmc=
MemcachedClient
;
34 mc.EnableCompression=false;
35
36 Console.WriteLine("------------测 试-----------");
37 mc.Set("test","myvalue"); //存储数据到缓存Cache服务器
这里将
串"myvalue"缓存Cache
key是"test"
38
39
(mc.KeyExists("test")) //测试缓存Cache存在key为test
项目
40 {
41 Console.WriteLine("testisExists");
42 Console.WriteLine(mc.Get("test").![](/icons/11405ToString.gif)
); //在缓存Cache中获取key为test
项目
43 }
44 ![](/icons/11405else.gif)
45 {
46 Console.WriteLine("testnotExists");
47 }
48
49 Console.ReadLine
;
50
51 mc.Delete("test"); //移除缓存Cache中key为test
项目
52
53
(mc.KeyExists("test"))
54 {
55 Console.WriteLine("testisExists");
56 Console.WriteLine(mc.Get("test").![](/icons/11405ToString.gif)
);
57 }
58 ![](/icons/11405else.gif)
59 {
60 Console.WriteLine("testnotExists");
61 }
62 Console.ReadLine
;
63
64 SockIOPool.GetInstance
.Shutdown
; //关闭池
关闭
s
65 }
66 }
67}
4 运行结果
![](http://www.crazycoder.cn/WebFiles/20091/703a4bae-0f88-43c9-a217-e5afd0ee438b.jpg)
后记: 是个不错
![](/icons/11405de.gif)
东西
![](/icons/11405dou.gif)
使用起来也很方便
![](/icons/11405dou.gif)
php ,ruby
![](/icons/11405de.gif)
项目中用这个
![](/icons/11405de.gif)
很多
![](/icons/11405dou.gif)
但是.net项目中用
![](/icons/11405de.gif)
较少(恕俺孤陋寡闻)
![](/icons/11405dou2.gif)
希望有兴趣
![](/icons/11405de.gif)
朋友们 多多交流