一、安装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" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <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,如图:
      
    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 />
启动调试服务器,若没有出错的日志记录,说明IO连接池已经开辟成功。
        六,使用Memcached
       终于进入正题了,不过使用之前,我们还需要准备一些数据。
      创建一个实体类People,并加上Serializable属性!!!
      对应的数据库里,增加一张表,字段对应实体类,插入一些测试数据。持久层和业务层的设计就略过了,他们负责向提供一些数据,返回类型可自定,若ILIST,DATASET。
     Memcached使用起来就很简单了,比如后台检索出一组People类型的数据,放在一个叫peopleList的arraylist里,而且这个arraylist要频繁使用,只需要这样
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = true;
mc.Set(key, peopleList);    
         上面的key是用来访问这个arraylist的键,Memcached里的数据都是保存为键-值对的。
一旦mc.KeyExists(key)为TRUE,就用return mc.Get(key) as ArrayList提取数据,删除时,使用 return mc.Delete(key);等等。可以自己琢磨了。

         以上只是演示,其实数据缓存是一项复杂而繁琐的工作,不仅需要后台代码的分层优化,也需要数据库对大数据量访问的策略和调优。



相关文章: