首页 > 代码库 > MemcachedUI-一款基于.NET MVC编写的Memcached监控软件
MemcachedUI-一款基于.NET MVC编写的Memcached监控软件
一、起源
服务器上使用了Memcached做缓存加速,但是想查看Memcached状态的时候都只能telnet 127.0.0.1 11211 这样来查看,甚是累人,就想能不能做一款web端的软件,方便在PC and 手机上查看,所以就有了这一款软件(属于闲暇时光写的,如有不对,请指正)
二、安装Memcached And 新建Web项目
安装教程略过,因为网上有许多教程,如有不懂请留言问我吧,我电脑上安装了4个Memcached作为测试用
新建一个MVC的项目(其他也行,随自己),并在Nuget上搜索安装包Memcached.ClientLibrary
三、主要代码演示与讲解
首先,我们新建一个类MemcachedHelper
,代码如下
using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Web;using Memcached.ClientLibrary;using Newtonsoft.Json; namespace MemcachedUI.Web.Models{ public class MemcachedHelper { private MemcachedClient _mc; public MemcachedHelper(string[] servers) { //初始化池 SockIOPool pool = SockIOPool.GetInstance(); pool.SetServers(servers); pool.InitConnections = 3; pool.MinConnections = 3; pool.MaxConnections = 5; pool.SocketConnectTimeout = 1000; pool.SocketTimeout = 3000; pool.MaintenanceSleep = 30; pool.Failover = true; pool.Nagle = false; pool.Initialize(); _mc = new MemcachedClient { EnableCompression = false }; } /// <summary>获取Memcached的状态 /// /// </summary> /// <returns></returns> public Hashtable Stats() { return _mc.Stats(); } /// <summary>获取设置的服务器集群 /// /// </summary> /// <returns></returns> public static ServersModel GetServerList() { StreamReader sr = System.IO.File.OpenText(System.Web.HttpContext.Current.Server.MapPath("~/Config/Servers.json")); StringBuilder jsonArrayTextTmp = new StringBuilder(); string input; while ((input = sr.ReadLine()) != null) { jsonArrayTextTmp.Append(input); } sr.Close(); ServersModel model = JsonConvert.DeserializeObject<ServersModel>(jsonArrayTextTmp.ToString()); return model; } }}
Memcached的列表放在/Config/Servers.json文件中,这里是我本地的4个Memcached实例
{ "Data": [ { "ServerName": "本地服务器-1", "Address": "127.0.0.1:11211" }, { "ServerName": "本地服务器-2", "Address": "127.0.0.1:11212" }, { "ServerName": "本地服务器-3", "Address": "127.0.0.1:11213" }, { "ServerName": "本地服务器-4", "Address": "127.0.0.1:11214" } ]}
HomeController主要为展示页面
public ActionResult Index() { var model = MemcachedHelper.GetServerList(); string[] servers = model.Data.Select(t => t.Address).ToArray(); ViewBag.ht = new MemcachedHelper(servers).Stats(); ViewBag.ServerList = model; return View(); } public ActionResult Node(string server) { ViewBag.ht = new MemcachedHelper(new string[] { server }).Stats(); return View(); }
首页集群页面代码如下
@{ ViewBag.Title = "集群视图";}@using System.Collections;@using MemcachedUI.Web.Models<div class="row"> @{ ServersModel model = ViewBag.ServerList; Hashtable ht = (Hashtable)ViewBag.ht; foreach (DictionaryEntry de in ht) { Hashtable info = (Hashtable)de.Value; string servsername = de.Key.ToString(); foreach (var datum in model.Data) { if (datum.Address == de.Key.ToString()) { servsername = datum.ServerName; continue; } } <div class="col-md-3"> <div class="panel panel-primary"> <div class="panel-heading" onclick=""> @Html.Raw(servsername) 概况 </div> <div class="panel-body"> <div class="container-fluid"> <div><label>服务器进程ID</label>:@Html.Raw(info["pid"].ToString())</div> <div><label>服务器运行时间</label>:@Html.Raw(info["uptime"].ToString())</div> <div><label>服务器当前的UNIX 时间</label>:@Html.Raw(info["time"].ToString())</div> <div><label>版本号</label>:@Html.Raw(info["version"].ToString())</div> <div><label>服务器操作系统位数</label>:@Html.Raw(info["pointer_size"].ToString())</div> <div><label>当前连接数</label>:@Html.Raw(info["curr_connections"].ToString())</div> <div><label>总连接数</label>:@Html.Raw(info["total_connections"].ToString())</div> <div><label>获取请求数量</label>:@Html.Raw(info["cmd_get"].ToString())</div> <div><label>存储请求数量</label>:@Html.Raw(info["cmd_set"].ToString())</div> <div><label>flush请求的数量</label>:@Html.Raw(info["cmd_flush"].ToString())</div> <div><label>获取成功的总次数</label>:@Html.Raw(info["get_hits"].ToString())</div> <div><label>获取失败的总次数</label>:@Html.Raw(info["get_misses"].ToString())</div> <div><label>删除失败次数</label>:@Html.Raw(info["delete_misses"].ToString())</div> <div><label>删除命中次数</label>:@Html.Raw(info["delete_hits"].ToString())</div> <div><label>递增失败次数</label>:@Html.Raw(info["incr_misses"].ToString())</div> <div><label>递增命中次数</label>:@Html.Raw(info["incr_hits"].ToString())</div> <div><label>递减命中次数</label>:@Html.Raw(info["decr_misses"].ToString())</div> <div><label>递减失败次数</label>:@Html.Raw(info["decr_hits"].ToString())</div> <div><label>Cas 原子设置操作失败次数</label>:@Html.Raw(info["cas_misses"].ToString())</div> <div><label>Cas 命中次数</label>:@Html.Raw(info["cas_hits"].ToString())</div> <div><label>Cas 操作找到key, 但是版本过期,没有设置成功</label>:@Html.Raw(info["cas_badval"].ToString())</div> <div><label>认证次数(包括成功和失败)</label>:@Html.Raw(info["auth_cmds"].ToString())</div> <div><label>认证失败次数</label>:@Html.Raw(info["auth_errors"].ToString())</div> <div><label>总共获取的数据量</label>:@Html.Raw(info["bytes_read"].ToString())</div> <div><label>总写入数量数</label>:@Html.Raw(info["bytes_written"].ToString())</div> <div><label>总允许写入的数据量</label>:@Html.Raw(info["limit_maxbytes"].ToString())</div> <div><label>允许的总连接数</label>:@Html.Raw(info["accepting_conns"].ToString())</div> <div><label>监听失败的次数</label>:@Html.Raw(info["listen_disabled_num"].ToString())</div> <div><label>需要的工作线程数</label>:@Html.Raw(info["threads"].ToString())</div> <div><label>conn_yields</label>:@Html.Raw(info["conn_yields"].ToString())</div> <div><label>已用缓存空间</label>:@Html.Raw(info["bytes"].ToString())</div> <div><label>当前缓存item数量</label>:@Html.Raw(info["curr_items"].ToString())</div> <div><label>总的存储缓存item数量</label>:@Html.Raw(info["total_items"].ToString())</div> <div><label>通过删除item释放内存的次数</label>:@Html.Raw(info["evictions"].ToString())</div> </div> </div> </div> </div> } } </div>
运行截图
四、后语
本文只是简单的将各个属性代表的意思给读取出来,大家可以根据自己的要求修改,如添加命中率等
闲暇时间写的,如有不对,请指正,谢谢
MemcachedUI-一款基于.NET MVC编写的Memcached监控软件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。