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 = ;
pool.MinConnections = ;
pool.MaxConnections = ;
pool.SocketConnectTimeout = ;
pool.SocketTimeout = ;
pool.MaintenanceSleep = ;
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监控软件的更多相关文章
- 几款开源的图形化Redis客户端管理软件
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/98.html?1455870209 Redis是一个超精简的基于内存的键值 ...
- 几款开源的图形化Redis客户端管理软件推荐
Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起 ...
- 简易的highcharts公共绘图模块封装--基于.net mvc
运行效果: 之所以选择这个图表插件,是因为它较其他同类插件轻量且中文文档详细完整,Demo丰富,配置使用简单.具体内容请登录中文官网:http://www.hcharts.cn/ 项目详细: 项目环境 ...
- 基于Spring MVC 实现拦截器
Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的, ...
- PureMVC--一款多平台MVC框架
官网:http://puremvc.org/ 下载:https://github.com/PureMVC/puremvc-csharp-multicore-framework/tree/1.1.0 A ...
- SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器
SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器 天幕如遮,唯我一刀可碎千里华盖,纵横四海而无阻,是谓碎遮 --取自<有匪> 写在前面 这段时间很多时间都在忙着编写该项目 ...
- 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构
基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业 ...
- 基于C#和Asp.NET MVC开发GPS部标监控平台
基于交通部796标准开发部标监控平台,选择开发语言和技术也是团队要思考的因素,其实这由团队自己擅长的技术来决定,如果擅长C#和Asp.NET, 当然开发效率就高很多.当然了技术选型一定要选用当前主流的 ...
- 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构(转)
http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通 ...
随机推荐
- Alpha冲刺四
第四天 日期:2018/6/19 1.1 今日完成任务情况以及遇到的问题. 成员 汝春瑞.曹 阳 赵红波.梁玉龙 傅 康.丁炜轩 今日完成任务 设计餐厅每个店家的餐品界面 完成公告和失物招领 ...
- AtCoder Regular Contest 090
C - Candies 链接:https://arc090.contest.atcoder.jp/tasks/arc090_a 题意:从左上角走到右下角,只能向右和向下走,问能最多能拿多少糖果. 思路 ...
- Web3D
https://baike.baidu.com/item/WEB%203D/11066359?fr=aladdin https://zhidao.baidu.com/question/17325151 ...
- #2019-2020-4 《Java 程序设计》第七周总结
2019-2020-4 <Java 程序设计>第七周知识总结 第八章:常用实用类 一.String类 String类的构造方法 public String(byte[] bytes); p ...
- C语言闰年问题程序框图
判定2000-2500年中的每一年是否为闰年,并将结果输出. 先分析闰年成立条件: 1)能被4整除,但不能被100整除的年份都是闰年: (2)能被400整除的年份是闰年: #include<st ...
- Newtonsoft.Json 时间格式化
时间序列化经常多个T:“2017-01-23T00:00:00” 解决方案: 日期格式化输出,指定IsoDateTimeConverter的DateTimeFormat即可 IsoDateTimeCo ...
- go的基本数据类型
一,数据类型的介绍 在go语言中,数据类型是用于声明函数和变量的:数据类型是为了把数据分成所需内存不同大小的数据,除了在需要使用大数据的时候才会申请大内存,这样就会充分的使用内存 Go 语言按类别有以 ...
- Error creating bean with name 'student': Unsatisfied dependency expressed through field 'teacher'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating
有 有参构造但是没有无参构造...
- Kinfu配置指南
Kinfu配置指南 欢迎加入Kinfu讨论群:563741937 写给准备配置pcl-kinfu的同学,这个是我的配置方法,已经能用的请无视. 我的配置:Windows7,VS2010(用这个的是不是 ...
- 0723掰棒子记录--vue的数据渲染
问题1:想要在一个panel标签中添加一个图片,panel中有一个datalist属性.如何设计标签可以插入想要的图片. template: <panel :list="dataLis ...