技术开发 频道

.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语句。说明每访问一次该页面,都要进行一次数据库的访问操作。

0
相关文章