登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

分布式缓存系统Memcached简介与以及在.net下的实践(转)  

2010-06-21 14:38:44|  分类: .net技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://hi.baidu.com/wuxincai/blog/item/a2c9e9f2450fe714b07ec5d5.html(转)

缘起: 在数据驱动的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 代码

 

   

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

 

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 }


三.应用

  1.新建ASP.NET站点,将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll添加到web引用。

   2.为了进行后续的测试,我们创建两个aspx页面,memcache.aspx和nomemcache.aspx,memcache.aspx是使用 MemcacheClient类加入了缓存机制的页面。nomemcache.aspx是没有加入缓存机制的页面,直接连接的数据库。一会我们通过观察数 据库事件和进行压力测试来测试在压力测试的情况下应用程序的性能。

  3.memcache.aspx.cs中添加对Memcached.ClientLibrary.dll的引用,即:using Memcached.ClientLibrary;Page_Load()中加入如下代码。

  protected void Page_Load(object sender, EventArgs e)

  {

  string[] serverlist = new string[] { "127.0.0.1:11211" };

  string poolName = "MemcacheIOPool";

  SockIOPool pool = SockIOPool.GetInstance(poolName);

  //设置连接池的初始容量,最小容量,最大容量,Socket 读取超时时间,Socket连接超时时间

  pool.SetServers(serverlist);

  pool.InitConnections = 1;

  pool.MinConnections = 1;

  pool.MaxConnections = 500;

  pool.SocketConnectTimeout = 1000;

  pool.SocketTimeout = 3000;

  pool.MaintenanceSleep = 30;

  pool.Failover = true;

  pool.Nagle = false;

  pool.Initialize();//容器初始化

  //实例化一个客户端

  MemcachedClient mc = new MemcachedClient();

  mc.PoolName = poolName;

  mc.EnableCompression = false;

  string key = "user_info";//key值

  object obj = new object();

  if (mc.KeyExists(key)) //测试缓存中是否存在key的值

  {

  obj = mc.Get(key);

  User user2 = (User)obj;

  Response.Write("
" + user2.Name + "," + user2.Pwd + "
");

  }

  else {

  string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

  SqlConnection conn = new SqlConnection(conStr);

  conn.Open();

  string sql = "Select * From T_User Where id=1";

  SqlCommand cmd = new SqlCommand(sql, conn);

  SqlDataReader dr = cmd.ExecuteReader();

  User user = new User();

  while (dr.Read())

  {

  user.Name = dr["name"].ToString();

  user.Pwd = dr["pwd"].ToString();

  }

  dr.Close();

  conn.Close();

  mc.Set(key, user, System.DateTime.Now.AddMinutes(2)); //存储数据到缓存服务器,这里将user这个对象缓存,key 是"user_info1"

  Response.Write("
姓名:" + user.Name + ",密码:" + user.Pwd + "
");

  }

  }

  4.nomemcache.aspx是没有加缓存机制的直接连接数据库的页面。nomemcache.aspx.cs中的代码:

  protected void Page_Load(object sender, EventArgs e)

  {

  string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

  SqlConnection conn = new SqlConnection(conStr);

  conn.Open();

  string sql = "Select * From T_User Where id=2";

  SqlCommand cmd = new SqlCommand(sql, conn);

  SqlDataReader dr = cmd.ExecuteReader();

  User user = new User();

  while (dr.Read())

  {

  user.Name = dr["name"].ToString();

  user.Pwd = dr["pwd"].ToString();

  }

  dr.Close();

  conn.Close();

  Response.Write("
姓名:" + user.Name + ",密码:" + user.Pwd + "
");

  }

  }

  5.测试

   测试memcache.aspx页面,该测试的主要目的是访问memcache.aspx页面,看是否看该页面走的是memcached而非访问的数据 库(第一次是访问数据库)。首先,我们运行memcache.aspx页面,通过Sql Server Profiler来查看运行memcache.aspx页面对数据库的操作情况。第一次运行memcache.aspx的时候,Sql Server Profiler里面显示memcache.aspx对数据库的操作,即执行了Select * From T_User Where id=1。

  memcache.aspx页面上第一次运行的时候显示如下信息:

  通过读取数据库得到的数据:

  姓名:lucy,密码:lucy。

  接着我们刷新memcache.aspx页面,页面上还显示上述信息:

  通过读取缓存得到的数据:

  姓名:lucy,密码:lucy

  但从Sql Server Profiler观察,memcache.aspx页面没有对数据库进行任何操作。说明我们第二次访问该页面是读取的缓存,接着不停的刷新页面,都显示的是通过读取缓存得到的数据。直到到达缓存失效时间。

   测试nomemcache.aspx,我们运行nomemcache.aspx页面,每刷新一次(包括第一次),Sql Server Profiler都记录了,nomemcache.aspx页面对数据库进行的操作,即之行了Select * From T_User Where id=2语句。说明每访问一次该页面,都要进行一次数据库的访问操作。


四.压力测试以及性能分析

  这里我们使用Microsoft Web Application Stress Tool对web进行压力测试,Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具。透过这套功能强大的压力测试工具,您可以使用少量的客户端计算机仿真大量用户上 线对网站服务所可能造成的影响,在网站实际上线之前先对您所设计的网站进行如同真实环境下的测试,以找出系统潜在的问题,对系统进行进一步的调整、设置工 作。就是因为这些特性,才使它具备了DOS轰炸的功能。

  1、工具简单设置

  打开Web Application Stress Tool,很简洁的一个页面,上面是工具栏,左下方是功能选项,右下方是详细设置选项。在对目标Web服务器进行压力测试之前,先对它进行一些必要的设置。

   (1).在“settings”的功能设置中(如下图),一个是Stress level (threads)这里是指定程序在后台用多少线程进行请求,也就是相当于模拟多少个客户机的连接,更加形象的就是说设置多少轰炸的线程数。一般填写 500~1000,因为这个线程数是根据本机的承受力来设置的,如果你对自己的机器配置有足够信心的话,那么设置的越高,轰炸的效果越好。

  (2).在“Test Run Time”中来指定一次压力测试需要持续的时间,分为天、小时、分、秒几个单位级别,你根据实际情况来设置吧!这里面设置测试时间为1分钟。

  (3).其余的选项大家可以根据自己的情况设置。

  2、压力测试

  步骤1:在工具中点右键,选择Add命令,增加了一个新的测试项目:memcache,对它进行设置,在主选项中的server中填写要测试的服务器的 IP地址,这里我们是在本机上进行测试,所以填写localhost。在下方选择测试的Web连接方式,这里的方式Verb选择 get,path选择要测试的Web页面路径,这里填写/WebMemCache/memcache.aspx,即加入缓存的memcache.aspx 页面(如下图)。

  步骤2:在“Settings”的功能设置中将Stress level (threads)线程数设置为500。完毕后,点工具中的灰色三角按钮即可进行测试(如下图)。

  同理,我们在建一个nomemcach的项目用来测试nomemcache.aspx页面。Memcach和nomemcach测试完毕后,点击工具栏上的Reports按钮查看测试报告:

  3.性能分析

  Memcache.aspx的测试报告:

  Overview

  ================================================================================

  Report name: 2009-7-20 10:52:00

  Run on: 2009-7-20 10:52:00

  Run length: 00:01:12

  Web Application Stress Tool Version:1.1.293.1

  Number of test clients: 1

  Number of hits: 2696

  Requests per Second: 44.93

  Socket Statistics

  --------------------------------------------------------------------------------

  Socket Connects: 3169

  Total Bytes Sent (in KB): 646.80

  Bytes Sent Rate (in KB/s): 10.78

  Total Bytes Recv (in KB): 2019.37

  Bytes Recv Rate (in KB/s): 33.65

  Socket Errors

  --------------------------------------------------------------------------------

  Connect: 0

  Send: 0

  Recv: 0

  Timeouts: 0

  RDS Results

  --------------------------------------------------------------------------------

  Successful Queries: 0

  Page Summary

  Page Hits TTFB Avg TTLB Avg Auth Query

  ================================================================================

  GET /WebMemCache/memcache.aspx 2696 1.94 1.95 No No

  Nomemcache.aspx的测试报告:

  Overview

  ================================================================================

  Report name: 2009-7-20 10:54:01

  Run on: 2009-7-20 10:54:01

  Run length: 00:01:12

  Web Application Stress Tool Version:1.1.293.1

  Number of test clients: 1

  Number of hits: 2577

  Requests per Second: 42.95

  Socket Statistics

  --------------------------------------------------------------------------------

  Socket Connects: 2860

  Total Bytes Sent (in KB): 589.32

  Bytes Sent Rate (in KB/s): 9.82

  Total Bytes Recv (in KB): 1932.75

  Bytes Recv Rate (in KB/s): 32.21

  Socket Errors

  --------------------------------------------------------------------------------

  Connect: 0

  Send: 0

  Recv: 0

  Timeouts: 0

  RDS Results

  --------------------------------------------------------------------------------

  Successful Queries: 0

  Page Summary

  Page Hits TTFB Avg TTLB Avg Auth Query

  ================================================================================

  GET /WebMemCache/nomemcache.aspx 2577 4.75 4.79 No No

   从测试报告上看出memcache.aspx页面在一分钟内的Hits(命中次数)2696,平均TTFB是(Total Time to First Byte)1.94,平均TTLB(Total Time to Last Byte)是1.95。这些参数都低于nomemcache.aspx。另外memcache.aspx的Requests per Second(每秒请求的次数)是 44.93高于nomemcache.aspx页面的42.95.这些参数都说明memcache.aspx页面的执行性能要高于 nomemcache.aspx页面。缓存起到了提高性能的作用。当然我这里面进行的测试只是模拟500个用户在1分钟内的访问对Web服务器性能的影 响。

  总结

  本文简单介绍了Memcached的基本原理,特点以及工作方式,接下来介绍了 Windows下Memcached服务器端程序的安装方法、在.NET应用程序中使用.NET memcached client library。接下来通过运行分析程序来了解memcached的工作原理机制,最后通过压力测试工具对没有加入Memcached机制的页面和加入 Memcached页面进行了压力测试,对比加入Memcached机制前后Web应用程序的性能。了解Memcached内部构造, 就能知道如何在应用程序中使用memcached才能使Web应用的速度更上一层楼。提升web应用程序的性能和访问速度。



  评论这张
 
阅读(649)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018