zoukankan      html  css  js  c++  java
  • Discuz Nt 3.0开启Memcached 以及二次开发监控Memcached状态

    2009年9月的时候,discuz 推出了3.0版本的discuz nt,虽然与之前的提供SNS社区的目标相比缩水了不少,但是还是令人期待的,官方的说法是修改了大量的bug,先发布一个稳定的版本,为后面的其它发展打下基础。

               Discuz NT已经集成了Memcached来做缓存,代震军 在他的博客里面对原理和思路也做了很多的阐述:

               Discuz!NT 缓存设计简析 [原创]

               Discuz!NT中集成Memcached分布式缓存

              一、安装Memcached及Memcached配置和状态查询

              要想使用Memcached做缓存首先需要安装Memcached服务,安装方法如下:

          1. 下载Memcached:http://code.jellycan.com/memcached/ 现在的最新版本是1.2.6.注意下载正确的版本,windows 服务的话下载win32 binary。

          2.解压之后放在硬盘的目录下,如:D:\memcached. 然后在运行中输入cmd进入命令行,进入到Memcached.exe 所在的目录,例如:D:\memcached,然后输入:Memcached –d install,即可完成安装。

              Memcached还有其他的一些常用的命令如下:

          -p 监听的端口
          -l 连接的IP地址, 默认是本机
          -d start 启动memcached服务
          -d restart 重起memcached服务
          -d stop|shutdown 关闭正在运行的memcached服务
          -d install 安装memcached服务
          -d uninstall 卸载memcached服务
          -u 以的身份运行 (仅在以root运行的时候有效)
          -m 最大内存使用,单位MB。默认64MB
          -M 内存耗尽时返回错误,而不是删除项
          -c 最大同时连接数,默认是1024
          -f 块大小增长因子,默认是1.25
          -n 最小分配空间,key+value+flags默认是48
          -h 显示帮助

              按照上面的安装步骤安装之后,使用memcached –m 200来调整最大内存占用之后会发现没有起作用,总是默认的64MB的内存,在网上搜了一下,原因是注册表中并没有写入信息,可以这样来修改。

             1. memcached –d shutdown 首先关闭memcached服务。

             2.进入注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server, 在其中有一个ImagePath项,值为"d:\memcached\memcached.exe" -d runservice,在后面加上-l 127.0.0.1 -m 3000 -c 2048。

            3.memcached –d start 启动memcached服务,这样就将memcached的最大内存修改为了3000MB。

            对Memcached缓存服务的状态查询,可以先telnet连接上服务:telnet 127.0.0.1 11211 ,然后使用 stats命令查看缓存服务的状态,会返回如下的数据:   

            time:    1255537291                               服务器当前的unix时间戳
            total_items:    54                                     从服务器启动以后存储的items总数量
            connection_structures:    19                    服务器分配的连接构造数
            version:    1.2.6                                        memcache版本
            limit_maxbytes:    67108864                    分配给memcache的内存大小(字节)
            cmd_get:    1645                                      get命令(获取)总请求次数
            evictions:    0                                            为获取空闲内存而删除的items数(分配给memcache的空间用满后需
                                                                             要删除旧的items来得到空间分配给新的items)
            total_connections:    19                           从服务器启动以后曾经打开过的连接数
            bytes:    248723                                      当前服务器存储items占用的字节数
            threads:    1                                             当前线程数
            get_misses:    82                                      总未命中次数
            pointer_size:    32                                    当前操作系统的指针大小(32位系统一般是32bit)
            bytes_read:    490982                              总读取字节数(请求字节数)
            uptime:    161                                           服务器已经运行的秒数
            curr_connections:    18                             当前打开着的连接数
            pid:    2816                                               memcache服务器的进程ID
            bytes_written:    16517259                     总发送字节数(结果字节数)
            get_hits:    1563                                      总命中次数
            cmd_set:    54                                          set命令(保存)总请求次数
            curr_items:    28                                       服务器当前存储的items数量

          二、在Discuz NT 3.0中配置Memcached服务

            在Discuz NT 3.0中配置Memcached服务较为简单,找到论坛根目录下的config目录,找到Memcached.config,打开,进行如下配置:

    <?xml version="1.0"?>
    <MemCachedConfigInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance%22 xmlns:xsd="http://www.w3.org/2001/XMLSchema%22>
        <ApplyMemCached>(1)</ApplyMemCached>
        <ServerList>(2)</ServerList>
        <PoolName>DiscuzNT_MemCache</PoolName>
        <IntConnections>3</IntConnections>
        <MinConnections>3</MinConnections>
        <MaxConnections>5</MaxConnections>
        <SocketConnectTimeout>1000</SocketConnectTimeout>
        <SocketTimeout>3000</SocketTimeout>
        <MaintenanceSleep>30</MaintenanceSleep>
        <FailOver>true</FailOver>
        <Nagle>true</Nagle>
    </MemCachedConfigInfo>

          (1)处为"true”的时候表示Discuz NT打开Memcached缓存功能,为"false”的时候表示关闭Memcached缓存功能。

          (2)处填写Memcached服务器的IP地址+端口,例如:127.0.0.1:11211

       三、二次开发监控Memcached状态

           Discuz NT的一个好处就是开源的,并且我们能够再上面很灵活的进行二次开发,这里,我们就以监控Memcached状态为例来做一个二次开发。具体的步骤是:

          1.下载Memcached的.Net的开发包,下载地址是:http://sourceforge.net/projects/memcacheddotnet/

          2.在visual studio 2005或者2008中建立一个类库,例如命名为:MyBBS.BBS.Plugin.MemcachedStats,然后在项目点击右键,选择属性,将默认命名空间修改为:Discuz.Web,如图:

          1

        3.将Memcached的.Net开发包解压,将将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 等放到bin目录,并且在项目中引用Memcached.ClientLibrary.dll.

        4.在项目中引用Discuz.Forum.

        5.在项目中增加类,命名为memcachedstats.cs.记得最好是小写,继承自Discuz.Forum.PageBase。然后在类中override showpage()函数,我们就可以在这里来写代码了,如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Collections;
    using M=Memcached.ClientLibrary;

    namespace Discuz.Web
    {
        public class memcachedstats:Discuz.Forum.PageBase
        {
            public string MemcachedStatsOutput = string.Empty;
            protected override void ShowPage()
            {
                base.ShowPage();
                string[] servers = { "此处填写Memcachedf服务IP+端口" };
                M.SockIOPool pool = M.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();
                this.pagetitle = "MemcachedStats";
                M.MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
                StringBuilder sb = new StringBuilder();
                Hashtable ht = mc.Stats();
                sb.AppendLine("Memcached Stats:<br>");
                sb.AppendLine("_______________________________________<br>");
                foreach (DictionaryEntry de in ht)
                {
                    Hashtable info = (Hashtable)de.Value;
                    foreach (DictionaryEntry de2 in info)
                    {
                        sb.AppendLine(de2.Key.ToString() + ":&nbsp;&nbsp;&nbsp;&nbsp;" + de2.Value.ToString() + "<br>");
                    }
                }
                MemcachedStatsOutput = sb.ToString();
            }
        }
    }

        这样我们就将代码完成了,我们将Memcached服务的状态信息保存到了MemcachedStatsOutput 这个字段中了,那么我们怎么在页面上显示出来呢?在进行下一步之前,编译输出MyBBS.BBS.Plugin.MemcachedStats.dll然后上传到论坛根目录的bin目录下。

        6.在论坛根目录下面的templete\default\中新建memcachedstats.htm,写入下面的代码:

    <%template _header%>
    <div id="nav">
        <div class="wrap s_clear">
        <a href="{config.forumurl}" class="title">{config.forumtitle}</a> &raquo; <strong>Memcached Stats</strong>
        </div>
    </div>
    <div class="wrap with_side s_clear help" id="wrap">
       <div class="side">
            <div class="sideinner">
            </div>
            </div>
            <div class="cpmain">
            <div class="cpcontent">
                <h3 class="lightlink">Memcached Stats</h3>
                <hr class="solidline"/>
                {MemcachedStatsOutput}
            </div>
            </div>
    </div>
    <%template _copyright%>
    <%template _footer%>

         这里我们重点注意红色的部分,我们就是在这里来把我们上面的类库里面的MemcachedStatsOutput字段在这里输出的。

         7.进入论坛后台管理系统,点击“界面风格”——“模板管理”——“default”,这时我们就可以看到出现了memcachedstats这个模板了,勾中前面的复选框,然后选择“按选择的模板文件生成页面”。

         8.上面的工作完成之后,我们在浏览器中输入:您的论坛地址\memcachedstats.aspx,就可以看到统计的Memcached服务的信息了,如图:

       2

    四、结束语与参考信息

          怎么样,还是很简单的吧,当然这里仅仅是做了最基本的开发了,不过相信这些弄清楚了,其它的开发就不是很复杂了,大家也都可以开发出自己更多丰富多彩的功能了。

         下面列出的是其他的一些参考资料,希望对大家有帮助:

         Discuz NT 界面模板的基本语法:http://nt.discuz.net/doc/default.aspx?cid=42

         Memcached的安装:http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html

         网友编写的用php代码展示Memcached状态的代码:http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool

  • 相关阅读:
    使用kbmmw 生成REST 服务OpenAPI函数原型
    kbmmw 5.08 正式发布
    在datasnap 中使用unidac 访问数据(客户端)
    使用双引擎,让kbmmw 的客户端访问更方便
    使用kbmMWConfiguration 让 kbmmw smartservice 更聪明
    CE lua脚本
    error LNK2019: 无法解析的外部符号 __vsnwprintf,该符号在函数 "long __stdcall StringVPrintfWorkerW
    安装 directx sdk 出现 S1023 解决
    dx11的一些数据结构
    git 比较 change to be committed
  • 原文地址:https://www.cnblogs.com/yangrui/p/1584881.html
Copyright © 2011-2022 走看看