一、起源

服务器上使用了Memcached做缓存加速,但是想查看Memcached状态的时候都只能telnet 127.0.0.1 11211 这样来查看,甚是累人,就想能不能做一款web端的软件,方便在PC and 手机上查看,所以就有了这一款软件(属于闲暇时光写的,如有不对,请指正)

二、安装Memcached And 新建Web项目

安装教程略过,因为网上有许多教程,如有不懂请留言问我吧,我电脑上安装了4个Memcached作为测试用

新建一个MVC的项目(其他也行,随自己),并在Nuget上搜索安装包Memcached.ClientLibrary

三、主要代码演示与讲解

首先,我们新建一个类MemcachedHelper,代码如下

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Web;
  8. using Memcached.ClientLibrary;
  9. using Newtonsoft.Json;
  10.  
  11. namespace MemcachedUI.Web.Models
  12. {
  13. public class MemcachedHelper
  14. {
  15. private MemcachedClient _mc;
  16.  
  17. public MemcachedHelper(string[] servers)
  18. {
  19. //初始化池
  20. SockIOPool pool = SockIOPool.GetInstance();
  21. pool.SetServers(servers);
  22. pool.InitConnections = ;
  23. pool.MinConnections = ;
  24. pool.MaxConnections = ;
  25. pool.SocketConnectTimeout = ;
  26. pool.SocketTimeout = ;
  27. pool.MaintenanceSleep = ;
  28. pool.Failover = true;
  29. pool.Nagle = false;
  30. pool.Initialize();
  31. _mc = new MemcachedClient { EnableCompression = false };
  32. }
  33.  
  34. /// <summary>获取Memcached的状态
  35. ///
  36. /// </summary>
  37. /// <returns></returns>
  38. public Hashtable Stats()
  39. {
  40. return _mc.Stats();
  41. }
  42.  
  43. /// <summary>获取设置的服务器集群
  44. ///
  45. /// </summary>
  46. /// <returns></returns>
  47. public static ServersModel GetServerList()
  48. {
  49. StreamReader sr = System.IO.File.OpenText(System.Web.HttpContext.Current.Server.MapPath("~/Config/Servers.json"));
  50. StringBuilder jsonArrayTextTmp = new StringBuilder();
  51. string input;
  52. while ((input = sr.ReadLine()) != null)
  53. {
  54. jsonArrayTextTmp.Append(input);
  55. }
  56. sr.Close();
  57. ServersModel model = JsonConvert.DeserializeObject<ServersModel>(jsonArrayTextTmp.ToString());
  58. return model;
  59. }
  60. }
  61. }

Memcached的列表放在/Config/Servers.json文件中,这里是我本地的4个Memcached实例

  1. {
  2. "Data": [
  3. {
  4. "ServerName": "本地服务器-1",
  5. "Address": "127.0.0.1:11211"
  6. },
  7. {
  8. "ServerName": "本地服务器-2",
  9. "Address": "127.0.0.1:11212"
  10. },
  11. {
  12. "ServerName": "本地服务器-3",
  13. "Address": "127.0.0.1:11213"
  14. },
  15. {
  16. "ServerName": "本地服务器-4",
  17. "Address": "127.0.0.1:11214"
  18. }
  19. ]
  20. }

HomeController主要为展示页面

  1.      public ActionResult Index()
  2. {
  3. var model = MemcachedHelper.GetServerList();
  4. string[] servers = model.Data.Select(t => t.Address).ToArray();
  5.  
  6. ViewBag.ht = new MemcachedHelper(servers).Stats();
  7. ViewBag.ServerList = model;
  8. return View();
  9. }
  10.  
  11. public ActionResult Node(string server)
  12. {
  13. ViewBag.ht = new MemcachedHelper(new string[] { server }).Stats();
  14. return View();
  15. }

首页集群页面代码如下

  1. @{
  2. ViewBag.Title = "集群视图";
  3. }
  4. @using System.Collections;
  5. @using MemcachedUI.Web.Models
  6. <div class="row">
  7. @{
  8. ServersModel model = ViewBag.ServerList;
  9. Hashtable ht = (Hashtable)ViewBag.ht;
  10. foreach (DictionaryEntry de in ht)
  11. {
  12. Hashtable info = (Hashtable)de.Value;
  13. string servsername = de.Key.ToString();
  14. foreach (var datum in model.Data)
  15. {
  16. if (datum.Address == de.Key.ToString())
  17. {
  18. servsername = datum.ServerName;
  19. continue;
  20. }
  21. }
  22. <div class="col-md-3">
  23. <div class="panel panel-primary">
  24. <div class="panel-heading" onclick="">
  25. @Html.Raw(servsername) 概况
  26. </div>
  27. <div class="panel-body">
  28. <div class="container-fluid">
  29. <div><label>服务器进程ID</label>:@Html.Raw(info["pid"].ToString())</div>
  30. <div><label>服务器运行时间</label>:@Html.Raw(info["uptime"].ToString())</div>
  31. <div><label>服务器当前的UNIX 时间</label>:@Html.Raw(info["time"].ToString())</div>
  32. <div><label>版本号</label>:@Html.Raw(info["version"].ToString())</div>
  33. <div><label>服务器操作系统位数</label>:@Html.Raw(info["pointer_size"].ToString())</div>
  34. <div><label>当前连接数</label>:@Html.Raw(info["curr_connections"].ToString())</div>
  35. <div><label>总连接数</label>:@Html.Raw(info["total_connections"].ToString())</div>
  36. <div><label>获取请求数量</label>:@Html.Raw(info["cmd_get"].ToString())</div>
  37. <div><label>存储请求数量</label>:@Html.Raw(info["cmd_set"].ToString())</div>
  38. <div><label>flush请求的数量</label>:@Html.Raw(info["cmd_flush"].ToString())</div>
  39. <div><label>获取成功的总次数</label>:@Html.Raw(info["get_hits"].ToString())</div>
  40. <div><label>获取失败的总次数</label>:@Html.Raw(info["get_misses"].ToString())</div>
  41. <div><label>删除失败次数</label>:@Html.Raw(info["delete_misses"].ToString())</div>
  42. <div><label>删除命中次数</label>:@Html.Raw(info["delete_hits"].ToString())</div>
  43. <div><label>递增失败次数</label>:@Html.Raw(info["incr_misses"].ToString())</div>
  44. <div><label>递增命中次数</label>:@Html.Raw(info["incr_hits"].ToString())</div>
  45. <div><label>递减命中次数</label>:@Html.Raw(info["decr_misses"].ToString())</div>
  46. <div><label>递减失败次数</label>:@Html.Raw(info["decr_hits"].ToString())</div>
  47. <div><label>Cas 原子设置操作失败次数</label>:@Html.Raw(info["cas_misses"].ToString())</div>
  48. <div><label>Cas 命中次数</label>:@Html.Raw(info["cas_hits"].ToString())</div>
  49. <div><label>Cas 操作找到key, 但是版本过期,没有设置成功</label>:@Html.Raw(info["cas_badval"].ToString())</div>
  50. <div><label>认证次数(包括成功和失败)</label>:@Html.Raw(info["auth_cmds"].ToString())</div>
  51. <div><label>认证失败次数</label>:@Html.Raw(info["auth_errors"].ToString())</div>
  52. <div><label>总共获取的数据量</label>:@Html.Raw(info["bytes_read"].ToString())</div>
  53. <div><label>总写入数量数</label>:@Html.Raw(info["bytes_written"].ToString())</div>
  54. <div><label>总允许写入的数据量</label>:@Html.Raw(info["limit_maxbytes"].ToString())</div>
  55. <div><label>允许的总连接数</label>:@Html.Raw(info["accepting_conns"].ToString())</div>
  56. <div><label>监听失败的次数</label>:@Html.Raw(info["listen_disabled_num"].ToString())</div>
  57. <div><label>需要的工作线程数</label>:@Html.Raw(info["threads"].ToString())</div>
  58. <div><label>conn_yields</label>:@Html.Raw(info["conn_yields"].ToString())</div>
  59. <div><label>已用缓存空间</label>:@Html.Raw(info["bytes"].ToString())</div>
  60. <div><label>当前缓存item数量</label>:@Html.Raw(info["curr_items"].ToString())</div>
  61. <div><label>总的存储缓存item数量</label>:@Html.Raw(info["total_items"].ToString())</div>
  62. <div><label>通过删除item释放内存的次数</label>:@Html.Raw(info["evictions"].ToString())</div>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. }
  68.  
  69. }
  70.  
  71. </div>

运行截图

四、后语

本文只是简单的将各个属性代表的意思给读取出来,大家可以根据自己的要求修改,如添加命中率等

闲暇时间写的,如有不对,请指正,谢谢

MemcachedUI-一款基于.NET MVC编写的Memcached监控软件的更多相关文章

  1. 几款开源的图形化Redis客户端管理软件

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/98.html?1455870209 Redis是一个超精简的基于内存的键值 ...

  2. 几款开源的图形化Redis客户端管理软件推荐

    Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起 ...

  3. 简易的highcharts公共绘图模块封装--基于.net mvc

    运行效果: 之所以选择这个图表插件,是因为它较其他同类插件轻量且中文文档详细完整,Demo丰富,配置使用简单.具体内容请登录中文官网:http://www.hcharts.cn/ 项目详细: 项目环境 ...

  4. 基于Spring MVC 实现拦截器

    Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的, ...

  5. PureMVC--一款多平台MVC框架

    官网:http://puremvc.org/ 下载:https://github.com/PureMVC/puremvc-csharp-multicore-framework/tree/1.1.0 A ...

  6. SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器

    SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器 天幕如遮,唯我一刀可碎千里华盖,纵横四海而无阻,是谓碎遮 --取自<有匪> 写在前面 这段时间很多时间都在忙着编写该项目 ...

  7. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构

      基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业 ...

  8. 基于C#和Asp.NET MVC开发GPS部标监控平台

    基于交通部796标准开发部标监控平台,选择开发语言和技术也是团队要思考的因素,其实这由团队自己擅长的技术来决定,如果擅长C#和Asp.NET, 当然开发效率就高很多.当然了技术选型一定要选用当前主流的 ...

  9. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构(转)

    http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通 ...

随机推荐

  1. python搭建服务器时nginx的有关问题

    最近在学习Python服务器搭建的内容,网上大多是Windows环境下的,由于我使用的是Mac,为了不想装双系统折腾,就只好一步步采坑了.比较基础的我一步步记录下来, 1.安装nginx: brew ...

  2. Scikit-learn 安装

    Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...

  3. wzyxidian Scanner 与 Readable 的read()方法

    Readable接口中的read()方法实现了将字符串读入charBuffer中,但是只有在需要输出的时候才会调用. Scanner是文本扫描器类,利用Scanner扫描并输出charBuffer中的 ...

  4. U3D一些使用

    1,UGUI Button同时监听点击事件和长按事件:https://blog.csdn.net/yye4520/article/details/80844870

  5. rocket-mq windows下载安装

    内容来源:https://www.jianshu.com/p/4a275e779afa 1环境    JDK1.8.Maven.Git 2安装部署 1.下载 1.1地址:http://rocketmq ...

  6. PDF分享:国外优秀数学教材选评

    <国外优秀数学教材选评>推荐书目下载 具体内容请查看原内容: http://www.library.fudan.edu.cn/wjzx/list/373-1-20.htm 或者http:/ ...

  7. [转] C++中为什么要用指针,而不直接使用对象?

    原文点击这里 问题描述 我刚从 Java 转到使用 C++ 进行面向对象开发,我发现一个很让我非常困惑的问题:C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: C++ ...

  8. <笔记>字体文件的路径问题

    如果做过虚拟域名,不可以通过127.0.0.1来访问字体文件 改成通过虚拟域名访问,就没问题: 不过更建议使用相对路径

  9. Ajax获取Json多个集合并同时遍历

    Ajax获取Json多个集合并同时遍历: 方法一.:将多个集合放入MAP集合. 后台:Servlet @Override protected void doPost(HttpServletReques ...

  10. java基础点总结

    基础知识这种东西,没注意到的永远比想象中多.大部分都是在面试中问到的... 1.static关键字 变量,方法修饰;静态代码块;静态内部类; 静态导入:import static ,静态方法省略类名, ...