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构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通 ...
随机推荐
- python搭建服务器时nginx的有关问题
最近在学习Python服务器搭建的内容,网上大多是Windows环境下的,由于我使用的是Mac,为了不想装双系统折腾,就只好一步步采坑了.比较基础的我一步步记录下来, 1.安装nginx: brew ...
- Scikit-learn 安装
Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...
- wzyxidian Scanner 与 Readable 的read()方法
Readable接口中的read()方法实现了将字符串读入charBuffer中,但是只有在需要输出的时候才会调用. Scanner是文本扫描器类,利用Scanner扫描并输出charBuffer中的 ...
- U3D一些使用
1,UGUI Button同时监听点击事件和长按事件:https://blog.csdn.net/yye4520/article/details/80844870
- rocket-mq windows下载安装
内容来源:https://www.jianshu.com/p/4a275e779afa 1环境 JDK1.8.Maven.Git 2安装部署 1.下载 1.1地址:http://rocketmq ...
- PDF分享:国外优秀数学教材选评
<国外优秀数学教材选评>推荐书目下载 具体内容请查看原内容: http://www.library.fudan.edu.cn/wjzx/list/373-1-20.htm 或者http:/ ...
- [转] C++中为什么要用指针,而不直接使用对象?
原文点击这里 问题描述 我刚从 Java 转到使用 C++ 进行面向对象开发,我发现一个很让我非常困惑的问题:C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: C++ ...
- <笔记>字体文件的路径问题
如果做过虚拟域名,不可以通过127.0.0.1来访问字体文件 改成通过虚拟域名访问,就没问题: 不过更建议使用相对路径
- Ajax获取Json多个集合并同时遍历
Ajax获取Json多个集合并同时遍历: 方法一.:将多个集合放入MAP集合. 后台:Servlet @Override protected void doPost(HttpServletReques ...
- java基础点总结
基础知识这种东西,没注意到的永远比想象中多.大部分都是在面试中问到的... 1.static关键字 变量,方法修饰;静态代码块;静态内部类; 静态导入:import static ,静态方法省略类名, ...