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

 

当然在配置初始化缓存链接池时使用了配置文件方式(memcached.config)来管理相关参数,其info信息
类说明如下(Discuz.Config/MemCachedConfigInfo.cs):

/// <summary>
/// MemCached配置信息类文件
/// </summary>
public class MemCachedConfigInfo : IConfigInfo
{
    
private bool _applyMemCached;
    
/// <summary>
    
/// 是否应用MemCached
    
/// </summary>
     public bool ApplyMemCached
     {
        
get
         {
            
return _applyMemCached;
         }
        
set
         {
             _applyMemCached
= value;
         }
     }

    
private string _serverList;
    
/// <summary>
    
/// 链接地址
    
/// </summary>
     public string ServerList
     {
        
get
         {
            
return _serverList;
         }
        
set
         {
             _serverList
= value;
         }
     }

    
private string _poolName;
    
/// <summary>
    
/// 链接池名称
    
/// </summary>
     public string PoolName
     {
        
get
         {
            
return Utils.StrIsNullOrEmpty(_poolName) ? " DiscuzNT_MemCache " : _poolName;
         }
        
set
         {
             _poolName
= value;
         }
     }

    
private int _intConnections;
    
/// <summary>
    
/// 初始化链接数
    
/// </summary>
     public int IntConnections
     {
        
get
         {
            
return _intConnections > 0 ? _intConnections : 3 ;
         }
        
set
         {
             _intConnections
= value;
         }
     }

    
private int _minConnections;
    
/// <summary>
    
/// 最少链接数
    
/// </summary>
     public int MinConnections
     {
        
get
         {
            
return _minConnections > 0 ? _minConnections : 3 ;
         }
        
set
         {
             _minConnections
= value;
         }
     }

    
private int _maxConnections;
    
/// <summary>
    
/// 最大连接数
    
/// </summary>
     public int MaxConnections
     {
        
get
         {
            
return _maxConnections > 0 ? _maxConnections : 5 ;
         }
        
set
         {
             _maxConnections
= value;
         }
     }

    
private int _socketConnectTimeout;
    
/// <summary>
    
/// Socket链接超时时间
    
/// </summary>
     public int SocketConnectTimeout
     {
        
get
         {
            
return _socketConnectTimeout > 1000 ? _socketConnectTimeout : 1000 ;
         }
        
set
         {
             _socketConnectTimeout
= value;
         }
     }

    
private int _socketTimeout;
    
/// <summary>
    
/// socket超时时间
    
/// </summary>
     public int SocketTimeout
     {
        
get
         {
            
return _socketTimeout > 1000 ? _maintenanceSleep : 3000 ;
         }
        
set
         {
             _socketTimeout
= value;
         }
     }

    
private int _maintenanceSleep;
    
/// <summary>
    
/// 维护线程休息时间
    
/// </summary>
     public int MaintenanceSleep
     {
        
get
         {
            
return _maintenanceSleep > 0 ? _maintenanceSleep : 30 ;
         }
        
set
         {
             _maintenanceSleep
= value;
         }
     }

    
private bool _failOver;
    
/// <summary>
    
/// 链接失败后是否重启,详情参见http://baike.baidu.com/view/1084309.htm
    
/// </summary>
     public bool FailOver
     {
        
get
         {
            
return _failOver;
         }
        
set
         {
             _failOver
= value;
         }
     }

    
private bool _nagle;
    
/// <summary>
    
/// 是否用nagle算法启动socket
    
/// </summary>
     public bool Nagle
     {
        
get
         {
            
return _nagle;
         }
        
set
         {
             _nagle
= value;
         }
     }
}     




     这些参数我们通过注释应该有一些了解,可以说memcached的主要性能都是通过这些参数来决定的,大家
应根据自己公司产品和应用的实际情况配置相应的数值。

     当然,做完这一步之后就是对调用“缓存策略”的主体类进行修改来,使其根据对管理后台的设计来决定
加载什么样的缓存策略,如下:

/// <summary>
/// Discuz!NT缓存类
/// 对Discuz!NT论坛缓存进行全局控制管理
/// </summary>
public class DNTCache
{
    .
    
    
// 通过该变量决定是否启用MemCached
     private static bool applyMemCached = MemCachedConfigs.GetConfig().ApplyMemCached;     

    
/// <summary>
    
/// 构造函数
    
/// </summary>
     private DNTCache()
     {
        
if (applyMemCached)
             cs
= new MemCachedStrategy();
        
else
         {
             cs
= new DefaultCacheStrategy();

             objectXmlMap
= rootXml.CreateElement( " Cache " );
            
// 建立内部XML文档.
             rootXml.AppendChild(objectXmlMap);

            
// LogVisitor clv = new CacheLogVisitor();
            
// cs.Accept(clv);

             cacheConfigTimer.AutoReset
= true ;
             cacheConfigTimer.Enabled
= true ;
             cacheConfigTimer.Elapsed
+= new System.Timers.ElapsedEventHandler(Timer_Elapsed);
             cacheConfigTimer.Start();
         }
     }
    
    


  
    到这里,主要的开发和修改基本上就告一段落了。下面开始介绍一下如果使用Stats命令来查看缓存的
分配和使用等情况。之前在枚举类型Stats中看到该命令有几个主要的参数,分别是:

     stats
     stats reset
     stats malloc
     stats maps
     stats sizes
     stats slabs
     stats items
     stats cachedump slab_id limit_num
     stats detail [on|off|dump]

  
    而JAVAEYE的 robbin 写过一篇文章:贴一段遍历memcached缓存对象的小脚本,来介绍如何使用其中的  
“stats cachedump”来获取信息。受这篇文章的启发,我将MemCachedClient.cs文件中的Stats方法加以修
改,添加了一个command参数(字符串型),这样就可以向缓存服务器发送上面所说的那几种类型的命令了。

    测试代码如下:
  

protected void Submit_Click( object sender, EventArgs e)
{
     ArrayList arrayList
= new ArrayList();
     arrayList.Add(
" 10.0.1.52:11211 " ); // 缓存服务器的地址

     StateResult.DataSource
= MemCachedManager.GetStats(arrayList, (MemCachedManager.Stats)         
                                      Utils.StrToInt(StatsParam.SelectedValue,
0 ), Param.Text);
     StateResult.DataBind();            
}



    页面代码如下:
  
   

   

  

     我这样做的目的有两个,一个是避免每次都使用telnet协议远程登陆缓存服务器并输入相应的命令行
参数(我记忆力不好,参数多了之后就爱忘)。二是将来会把这个页面功能内置到管理后台上,以便后台
管理员可以动态监测每台缓存服务器上的数据。


     好了,到这里今天的内容就差不多了。在本文中我们看到了使用设计模式的好处,通过它我们可以让
自己写的代码支持“变化”。这里不妨再多说几句,大家看到了velocity在使用上也是很方便,如果可以
的话,未来可以也会将velocity做成一个“缓存策略”,这样站长或管理员就可以根据自己公司的实际情
况来加以灵活配置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值