.NET下实现分布式缓存系统Memcached

一.Memcached服务器端的安装(此处将其作为系统服务安装)

  下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)

  下载地址:http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip

  1.解压缩文件到c:\memcached

  2.命令行输入 c:\memcached\memcached.exe -d install‘

  3.命令行输入 c:\memcached\memcached.exe -d start ,该命令启动 Memcached ,默认监听端口为 11211

  通过 memcached.exe -h 可以查看其帮助,查看memcache状态,telnet 192.168.0.98 11211。输入stats查询状态

   stats

   STAT pid 8601

   STAT uptime 696

  STAT time 1245832689

   STAT version 1.2.0

   STAT pointer_size 64

   STAT rusage_user 0.007998

   STAT rusage_system 0.030995

   STAT curr_items 1

   STAT total_items 1

   STAT bytes 76

   STAT curr_connections 2

   STAT total_connections 4

   STAT connection_structures 3

   STAT cmd_get 1

   STAT cmd_set 1

   STAT get_hits 1//命中次数

   STAT get_misses 0 //失效次数

   STAT bytes_read 97

   STAT bytes_written 620

   STAT limit_maxbytes 134217728

   END

   -d选项是启动一个守护进程

   -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB

   -u是运行Memcache的用户

   -l是监听的服务器IP地址,如果有多个地址的话,我这里假定指定了服务器的IP地址为本机ip地址

      -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口

   -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定

   -P是设置保存Memcache的pid文件

  二..NET memcached client library(memcached的.NET客户端类库)

  下载memcached的.NET客户端类库,下载地址:https://sourceforge.net/projects/memcacheddotnet/里面有.net1.1 和 .net2.0的两种版本,里面还有.NET应用memcached的例子。
 三.应用

  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应用程序的性能和访问速度。

时间: 2024-10-18 20:22:17

.NET下实现分布式缓存系统Memcached的相关文章

分布式缓存系统 Memcached 整体架构

分布式缓存系统 Memcached整体架构 Memcached经验分享[架构方向] Memcached 及 Redis 架构分析和比较

分布式缓存系统Memcached在Asp.net下的应用

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 站下的session性能并不高,所以造成人们一种印象,大型WEB项目使用Java的错觉,致使很多人吐槽微软不给力,其实这好比拉不出怪地球引力,本

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

缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活.此时Memcached或许是你想要的. Memcached是什么?Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached能缓存什么?通过在内存里维护一个统一的巨大的hash表,Memc

分布式缓存系统Memcached

Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提高访问速度. 通过在内存中维护一个巨大的统一的hash表,Memcached能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. Memcached使用了libevent(如果可以的话,在linux下使用epoll) 来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不

分布式缓存系统 Memcached 基本配置与命令

为了方便测试,给出一个C客户端libmemcached链接:https://launchpad.net/libmemcached/ 以及memcacheclient-2.0 : http://code.jellycan.com/files/memcacheclient-2.0.zip(已生成 sln,在windows下直接用VS打开,编译成功) 在Memcached启动时,有很多配置参数可以选择,以下参数对应memcached1.4.15,现给出这些参数的具体含义: "a:" //un

分布式缓存系统Memcached(十二)——基本配置与命令

为了方便测试,给出一个C客户端libmemcached链接:https://launchpad.net/libmemcached/ 以及memcacheclient-2.0 : http://code.jellycan.com/files/memcacheclient-2.0.zip(已生成 sln,在windows下直接用VS打开,编译成功) 在Memcached启动时,有很多配置参数可以选择,以下参数对应memcached1.4.15,现给出这些参数的具体含义: "a:" //un

分布式缓存系统 Memcached 数据存储slab与hashtable

缓存数据以item为基本单元,以双链表形式存放在对应级别大小的slabclass结构的chunk中.同时该item还存放在链式hashtable中bucket中,用于提供快速查找的索引. 首先是理解缓存的基本数据单元item结构: typedef struct _stritem {    struct _stritem *next;    //在slab中的双链表后向指针    struct _stritem *prev;    //在slab中的双向链表的前向指针    struct _str

分布式缓存系统 Memcached slab和item的主要操作

上节在分析slab内存管理机制时分析Memcached整个Item存储系统的初始化过程slabs_init()函数:分配slabclass数组空间,到最后将各slab划分为各种级别大小的空闲item并挂载到对应大小slab的空闲链表slots上.本节将继续分析对slab和item的主要操作过程. slab机制中所采用的LRU算法: 在memcached运行过程中,要把一个item调入内存,但内存已无空闲空间时,为了保证程序能正常运行,系统必须从内存中调出一部分数据,送磁盘的对换区中.但应将哪些数

分布式缓存系统 Memcached 状态机之socket连接与派发

上节已经分析到了主线程中监听socket注册事件和工作线程中连接socket注册事件的回调函数都是event_handler,且event_handler的核心部分都是一个有限状态机:drive_machine.因此接下来将对该状态机具体的业务处理进行深入的剖析. memcached将每个socket都封装为一个conn结构体,该结构体包含了比如socket的文件描述符sfd.注册事件event.连接状态结构体conn_states,等等诸多信息字段,其中的状态结构:conn_states中包含