ASP.NET版Memcached监控工具
在上一篇文章《使用Memcached提高.NET应用程序的性能》中周公讲述如何在.NET中使用Memcached来提高.NET应用程序的性能。在实际的使用中有可能出现Memcached因为某些不可预知的原因挂掉,一旦出现这样的情况,就会再次给数据库增加巨大的压力,因此需要监控Memcached的运行情况。周公在网上找过,在网上有PHP版的Memcached监控工具,打开那个PHP页面就可以看到各个Memcached的运行情况,一旦不能获取到这些数据,说明Memcached不可访问,不可访问的原因可能是因为网络故障或者Memcached挂掉了,虽然原因不同,但是结果是一样的。参照了Enyim Memcached和PHP版Memcached监控工具的实现,周公实现了一个.NET版的监控工具。
实现思路
上一篇文章《使用Memcached提高.NET应用程序的性能》中周公讲述了可以通过Telnet来获取Memcached的运行状况,通过"stats"命令得到Memcached的数据,如果得不到相应的数据就证明Memcached不可访问。
其中向Memcached发送"stats"命令得到的数据的意义如下:
pid:32u,服务器进程ID。
uptime:32u, 服务器运行时间,单位秒。
time :32u, 服务器当前的UNIX时间。
version :string, 服务器的版本号。
curr_items :32u, 服务器当前存储的内容数量 Current number of items stored by the server
total_items :32u, 服务器启动以来存储过的内容总数。
bytes :64u, 服务器当前存储内容所占用的字节数。
curr_connections :32u, 连接数量。
total_connections :32u, 服务器运行以来接受的连接总数。
connection_structures:32u, 服务器分配的连接结构的数量。
cmd_get :32u, 取回请求总数。
cmd_set :32u, 存储请求总数。
get_hits :32u, 请求成功的总次数。
get_misses :32u, 请求失败的总次数。
bytes_read :64u, 服务器从网络读取到的总字节数。
bytes_written :64u, 服务器向网络发送的总字节数。
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。
上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。
在本篇中我们通过Socket而不是Telnet连接到Memcached,然后解析返回的数据。
程序代码
为了便于管理和维护,在本示例中使用了单页模式,也就是所有的代码都在一个ASPX页面中,没有对应的aspx.cs页面。
程序代码如下:
<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Net.Sockets" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Security" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<mce:script runat="server"><!--
/*
* 作者:周公
* 日期:2011-03-27
* 原文出处:http://blog.csdn.net/zhoufoxcn 或http://zhoufoxcn.blog.51cto.com
* 版权说明:本文可以在保留原文出处的情况下使用于非商业用途,周公对此不作任何担保或承诺。
* */
/// <summary>
/// Memcached服务器监控类
/// </summary>
public class MemcachedMonitor
{
/// <summary>
/// 连接Memcached的超时时间
/// </summary>
public TimeSpan ConnectionTimeout { get; set; }
/// <summary>
/// 接收Memcached返回数据的超时时间
/// </summary>
public TimeSpan ReceiveTimeout { get; set; }
private List<IPEndPoint> serverList;
public MemcachedMonitor(ICollection<IPEndPoint> list)
{
ConnectionTimeout = TimeSpan.FromSeconds(10);
ReceiveTimeout = TimeSpan.FromSeconds(20);
serverList = new List<IPEndPoint>();
serverList.AddRange(list);
}
public List<MemcachedServerStats> GetAllServerStats()
{
List<MemcachedServerStats> resultList = new List<MemcachedServerStats>();
foreach (IPEndPoint endPoint in serverList)
{
resultList.Add(GetServerStats(endPoint, ConnectionTimeout, ReceiveTimeout));
}
return resultList;
}
public static MemcachedServerStats GetServerStats(IPEndPoint ip, TimeSpan connectionTimeout, TimeSpan receiveTimeout)
{
MemcachedSocket socket = new MemcachedSocket(ip, connectionTimeout, receiveTimeout);
MemcachedServerStats stats = socket.GetStats();
return stats;
}
public static IPEndPoint Parse(string hostName,int port)
{
IPHostEntry host=Dns.GetHostEntry(hostName);
IPEndPoint endPoint = null;
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
endPoint = new IPEndPoint(ip, port);
break;
}
}
return endPoint;
}
}
/// <summary>
/// Memcached服务器运行状态数据类,只有当IsReachable为true时获取的数据才有意义,否则表示不可访问或者Memcached挂了
/// </summary>
public class MemcachedServerStats
{
private Dictionary<string, string> results;
/// <summary>
&nb
补充:Web开发 , ASP.Net ,