订阅到Rss阅读器

分布式缓存系统Memcached简介与实践

缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。此时Memcached或许是你想要的。

Memcached是什么?
Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

Memcached能缓存什么?
通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

Memcached快么?

非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。

Memcached的特点
Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

Memcached的使用
Memcached服务器端的安装 (此处将其作为系统服务安装)
  下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
   1 解压缩文件到c:\memcached
   2 命令行输入 'c:\memcached\memcached.exe -d install' 
   3 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211
  通过 memcached.exe -h 可以查看其帮助
二   .NET memcached client library
   下载文件:https://sourceforge.net/projects/memcacheddotnet/

   里面有.net1.1  和 .net2.0的两种版本  还有一个不错的例子。

三  应用

  1 将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 等放到bin目录
  2 引用
Memcached.ClientLibrary.dll
  3 代码

 1 namespace Memcached.MemcachedBench
 2 {
 3     using System;
 4     using System.Collections;
 5 
 6     using Memcached.ClientLibrary;
 7 
 8     public class MemcachedBench 
 9     {
10         [STAThread]
11         public static void Main(String[] args) 
12         {
13             string[] serverlist = { "10.0.0.131:11211""10.0.0.132:11211" };
14 
15             //初始化池
16             SockIOPool pool = 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.MaintenanceSleep = 30;
27             pool.Failover = true;
28 
29             pool.Nagle = false;
30             pool.Initialize();
31 
32             // 获得客户端实例
33             MemcachedClient mc = new MemcachedClient();
34             mc.EnableCompression = false;
35 
36             Console.WriteLine("------------测  试-----------");
37             mc.Set("test""my value");  //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test"
38 
39             if (mc.KeyExists("test"))   //测试缓存存在key为test的项目
40             {
41                 Console.WriteLine("test is Exists");
42                 Console.WriteLine(mc.Get("test").ToString());  //在缓存中获取key为test的项目
43             }
44             else
45             {
46                 Console.WriteLine("test not Exists");
47             }
48 
49             Console.ReadLine();
50 
51             mc.Delete("test");  //移除缓存中key为test的项目
52 
53             if (mc.KeyExists("test"))
54             {
55                 Console.WriteLine("test is Exists");
56                 Console.WriteLine(mc.Get("test").ToString());
57             }
58             else
59             {
60                 Console.WriteLine("test not Exists");
61             }
62             Console.ReadLine();
63             
64             SockIOPool.GetInstance().Shutdown();  //关闭池, 关闭sockets
65         }
66     }
67 }
  4 运行结果

 

   

   后记: 是个不错的东西 ,使用起来也很方便,php ,ruby 的项目中用这个的很多,但是.net项目中用的较少(恕俺孤陋寡闻) 。希望有兴趣的朋友们 多多交流 。 看到页首了么各位兄弟?

不用我多说了吧,挥动您的鼠标 轻轻按下左键吧

posted @ 2007-07-19 14:58 戏水 阅读(26227) 评论(47) 编辑 收藏

 回复 引用 查看   
#1楼 2007-07-19 15:22 浪子      
期待更进一步的心得文章。
很实用,慢慢看
 回复 引用 查看   
#3楼 2007-07-19 15:53 Artech      
最好是简单介绍一下MemCached实现的原理。
 回复 引用   
#4楼 2007-07-19 16:42 llxxxll[未注册用户]
phpx里有篇奶瓶的介绍Memcached的文章,讲了实现原理,楼上的可以去找找。
 回复 引用 查看   
#5楼 2007-07-19 16:47 Jeffrey Zhao      
这是个很重要的服务,非常有用,大大提升应用的性能和可伸缩性。
 回复 引用 查看   
#6楼 2007-07-19 16:48 BoyLee      
嘿嘿嘿。好多天没来园子,戏水同学发了个首页,不小心被我看到了。不顶没人性。
 回复 引用 查看   
#7楼 2007-07-19 17:15 try      
哈,真是非常感谢.搞个测试下.
 回复 引用 查看   
#8楼[楼主] 2007-07-19 17:25 戏水      
就是这篇文章 写的不错 推荐大家阅读http://www.phpx.com/happy/thread-131124-1-1.html
 回复 引用 查看   
#9楼[楼主] 2007-07-19 23:15 戏水      
托大家的福 ,今天收入1$ ..
大家举手之劳, 可解我燃眉之急

。。。。。。。。。。。

貌似livejournal.com被GFWed了
 回复 引用   
#11楼 2007-07-20 09:54 随风.NET[未注册用户]
点下支持你吧 呵呵
 回复 引用 查看   
#12楼 2007-07-20 12:58 钱彦云      
不错,收藏。
 回复 引用   
#13楼 2007-07-20 15:48 Databinder[未注册用户]
点下支持你
 回复 引用 查看   
#14楼 2007-07-20 17:52 jisen      
顶下!
 回复 引用   
#15楼 2007-07-21 01:44 alcoholwang[未注册用户]
已经在新的项目中使用了。。。。


不过效率值得商讨。。。。

最大的好处是cache的更新。。。以前多台服务器,CACHE不同步,更新问题,现在都可以通过memcached解决了。。。。

 回复 引用 查看   
#16楼[楼主] 2007-07-22 21:54 戏水      
不过效率值得商讨?
恩 ,具体所知,很多php的项目用的这个,而我的一个朋友头说 效果还不错。
效率确实是让人担心的问题。这方面我也没有进行过测试。 希望有能力有兴趣的朋友们测试一下 给出一些数据来

 回复 引用 查看   
#17楼 2007-07-25 09:37 flyingchen      
恩,写的不错。已经有一段时间没有来园子了。Memcached只能存储可序列的对象吧? 不知道这个理解对不对。
 回复 引用 查看   
#18楼 2007-09-19 11:35 巫云      
你说的点鼠标左键,是指点左上角的广告吗?
 回复 引用 查看   
#19楼 2007-12-05 22:51 蛙蛙池塘      
有空关注一下
 回复 引用   
#20楼 2008-03-19 16:23 神游[未注册用户]
--引用--------------------------------------------------
巫云: 你说的点鼠标左键,是指点左上角的广告吗?
--------------------------------------------------------
楼主啊,为了感谢你这篇好文,我点了好几下广告哦~~~

 回复 引用   
#21楼 2008-03-29 22:38 sx[未注册用户]
添加一个:facebook.com也是采用memcached来做缓冲应用
 回复 引用   
#22楼 2008-03-29 22:41 sx[未注册用户]
@alcoholwang
这位兄台,不知道你的项目需要多少负载量?memcached在短链接状态中,可以支持5000-7000次,长链接可以支持到3w次(都是在value<1KB)的状态中测试的。我最近也用到这东东,有兴趣的话,欢迎来信交流:leftatrium@vip.163.com,广告勿扰。

 回复 引用   
#23楼 2008-04-23 11:39 枯の灵[未注册用户]
很好的文章

谢谢分享了

 回复 引用 查看   
#24楼 2008-06-24 17:25 清炒白菜      
非常有用的介绍,最近正在自己捣鼓一个CACHE,主要在找Cache的淘汰算法。
 回复 引用   
#25楼 2008-06-27 16:25 3wdotec[未注册用户]
学习了...谢谢
 回复 引用   
#26楼 2008-06-30 09:54 eitrade[未注册用户]
刚下载了一个,,用用还可以.
 回复 引用   
#27楼 2008-07-02 09:55 renkui[未注册用户]
谢谢分享,,,转了...哈
 回复 引用 查看   
#28楼 2008-10-12 11:37 赵俊      
这个好像很有用呢!缓存DataSet的话是不是
mc.Set("datasettest", dataset);
????????????????、

 回复 引用   
#29楼 2008-10-21 11:27 yashika[未注册用户]
不知道.NET的客户端(ASPX)和PHP的客户端
+
LINUX的服务端

在这种混合服务器环境中单独使用linux作为主机能跑起来不?

 回复 引用   
#30楼 2008-10-21 12:19 yashika[未注册用户]
@yashika
实际部署测试是可以的


还有个问题.
多台服务器对memcache服务器的存取操作(临界资源)会不会有个争用问题?

 回复 引用   
#31楼 2008-10-21 14:48 yashika[未注册用户]
--引用--------------------------------------------------
yashika: @yashika
实际部署测试是可以的


还有个问题.
多台服务器对memcache服务器的存取操作(临界资源)会不会有个争用问题?
--------------------------------------------------------
经过测试(开N个客户端,分别做递增操作10000次),
mc.Set("test",Convert.toInt32(mc.Get("test")) + 1);
存在资源争用问题.最终结果不等于10000*N

但是如果使用
mc.StoreCounter("i", 0);//初始化计数器

for(10000){
mc.Increment("i",1); //以1递增
}

则不会存在争用问题.

 回复 引用 查看   
#32楼 2008-10-28 13:56 litsword      
请问一下,我在windows环境下安装
c:\memcached -d install -m 512
c:\memcached -d start

启动后我用telnet 连接上去查看
stats命令返回的limit_maxbytes还是67108864(64MB),如何修改内存分配大小?

 回复 引用   
#33楼 2008-12-21 21:13 darkcom[未注册用户]
我 轻轻按下左键吧
 回复 引用 查看   
#34楼 2008-12-24 15:20 sagacite      
安装在windows上是不是性能会差很多。。
 回复 引用   
#35楼 2009-03-20 16:53 objectprogram[未注册用户]
我现在正在给一个大型网站做性能优化,也正在考虑使用MemCache.
怎样联系你?想和你在MemCache方面做更多的交流.谢谢.
MSN:yaolin1985@hotmail.com
QQ:241933110

 回复 引用 查看   
#36楼 2009-08-12 00:42 昂轩      
看看...
 回复 引用 查看   
#37楼 2009-09-12 13:59 jeffery0101      
同样的问题,我也想知道怎么分配内存大小?谢谢!
 回复 引用 查看   
#38楼 2009-10-10 12:06 超SEO      
分布式缓存确实很重要!深有体会!
 回复 引用   
#39楼 2009-11-09 16:53 大胆地[未注册用户]
嗯,不错
 回复 引用 查看   
#40楼 2010-05-22 13:00 backhose      
进来看看。。。
 回复 引用 查看   
#41楼 2010-07-30 11:03 vebest      
mark
 回复 引用 查看   
#42楼 2010-08-09 13:45 jiang_chao      
来晚了,进来学习一下,怎么看不明白,

 回复 引用 查看   
#43楼 2010-09-15 08:04 北方的狼      
学习了,Mark!
 回复 引用 查看   
#44楼 2010-11-12 10:22 unfreedomium      
mark!
 回复 引用 查看   
#45楼 2011-03-29 13:18 MR.Jdh      
分布式缓存,学习了
 回复 引用 查看   
#46楼 2011-04-20 22:19 风的传说      
收下