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构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通 ...
随机推荐
- C# 结构体和List<T>类型数据转Json数据保存和读取
C# 结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...
- 【Selenium】【BugList10】smtp发送邮件问题汇总:550/535/554
[场景] 通过126邮箱向QQ邮箱发送HTML格式邮件 [代码1] from email.mime.text import MIMEText from email.header import Head ...
- 微信小程序开发之搞懂flex布局1——Flexbox
Flexbox ——弹性布局 Flexbox is a layout model for displaying items in a single dimension — as a row or as ...
- Java基础类
Java8提供了四千多个基础类,通过这些基础类库可以提高开发效率,使用它们编写好的类进行开发,不用自己去写好这个类,这个方法是干什么的,极大程度的降低了开发难度,为Java开发 带来了极大的便利.本文 ...
- python文件操作打开模式 r,w,a,r+,w+,a+ 区别辨析
主要分成三大类: r 和 r+ "读"功能 r 只读 r+ 读写(先读后写) 辨析:对于r,只有读取功能,利用光标的移动,可以选择要读取的内容. 对于r+,同时具有读和写 ...
- vue路由复用
使用多个<router-view>可以复用路由,但是每个<router-view>要带一个name属性 更改路由,配置默项和复用项,定义复用项的name 例子: App.vue ...
- 【repost】CSS3弹性布局
本文导读:在CSS 3中,CSS Flexible Box模块为一个非常重要的模块,该模块用于以非常灵活的方式实现页面布局处理.使用CSS Flexible Box模块中定义的弹性盒布局技术,可以根据 ...
- C#使用Dotfuscator混淆代码的加密方法
C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用VS自带的Dotfuscator可以实现混淆代 ...
- outlook VSTO
https://files.cnblogs.com/files/maooveyu/OutlookPhotoSync.rar
- Shader_ShaderForge_NGUI_序列帧/
序列帧 Shader篇 Shader Forge序列帧算法! 附上Shader代码部分: // Shader created with Shader Forge v1.26 // Shader For ...