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

 

上面代码中构造方法会初始化一个池来管理执行Socket链接,并提供静态属性CacheClient以便MemCachedStrategy
来调用。


    当然我还在这个管理操作类中添加了几个方法分别用于检测当前有效的分布式缓存服务器的列表,向指定(或全部)
缓存服务器发送特定stats命令来获取当前缓存服务器上的数据信息和内存分配信息等,相应的方法如下(详情见注释):

/// <summary>
/// 获取当前缓存键值所存储在的服务器
/// </summary>
/// <param name="key"> 当前缓存键 </param>
/// <returns> 当前缓存键值所存储在的服务器 </returns>
public static string GetSocketHost( string key)
{
    
string hostName = "" ;
     SockIO sock
= null ;
    
try
     {
         sock
= SockIOPool.GetInstance(memCachedConfigInfo.PoolName).GetSock(key);
        
if (sock != null )
         {
             hostName
= sock.Host;
         }
     }
    
finally
     {
        
if (sock != null )
             sock.Close();
     }
    
return hostName;
}


/// <summary>
/// 获取有效的服务器地址
/// </summary>
/// <returns> 有效的服务器地 </returns>
public static string [] GetConnectedSocketHost()
{
     SockIO sock
= null ;
    
string connectedHost = null ;
    
foreach ( string hostName in serverList)
     {
        
if ( ! Discuz.Common.Utils.StrIsNullOrEmpty(hostName))
         {
            
try
             {
                 sock
= SockIOPool.GetInstance(memCachedConfigInfo.PoolName).GetConnection(hostName);
                
if (sock != null )
                 {
                     connectedHost
= Discuz.Common.Utils.MergeString(hostName, connectedHost);
                 }
             }
            
finally
             {
                
if (sock != null )
                     sock.Close();
             }
         }
     }
    
return Discuz.Common.Utils.SplitString(connectedHost, " , " );
}

/// <summary>
/// 获取服务器端缓存的数据信息
/// </summary>
/// <returns> 返回信息 </returns>
public static ArrayList GetStats()
{
     ArrayList arrayList
= new ArrayList();
    
foreach ( string server in serverList)
     {
         arrayList.Add(server);
     }
    
return GetStats(arrayList, Stats.Default, null );
}

/// <summary>
/// 获取服务器端缓存的数据信息
/// </summary>
/// <param name="serverArrayList"> 要访问的服务列表 </param>
/// <returns> 返回信息 </returns>
public static ArrayList GetStats(ArrayList serverArrayList, Stats statsCommand, string param)
{
     ArrayList statsArray
= new ArrayList();
     param
=    Utils.StrIsNullOrEmpty(param) ? "" : param.Trim().ToLower();

    
string commandstr = " stats " ;
    
// 转换stats命令参数
     switch (statsCommand)
     {
        
case Stats.Reset: { commandstr = " stats reset " ; break ; }
        
case Stats.Malloc: { commandstr = " stats malloc " ; break ; }
        
case Stats.Maps: { commandstr = " stats maps " ; break ; }
        
case Stats.Sizes: { commandstr = " stats sizes " ; break ; }
        
case Stats.Slabs: { commandstr = " stats slabs " ; break ; }
        
case Stats.Items: { commandstr = " stats " ; break ; }
        
case Stats.CachedDump:
         {
            
string [] statsparams = Utils.SplitString(param, " " );
            
if (statsparams.Length == 2 )
                
if (Utils.IsNumericArray(statsparams))
                     commandstr
= " stats cachedump   " + param;

            
break ;                     
         }
        
case Stats.Detail:
             {
                
if ( string .Equals(param, " on " ) || string .Equals(param, " off " ) || string .Equals(param, " dump " ))
                     commandstr
= " stats detail " + param.Trim();

                
break ;
             }
        
default : { commandstr = " stats " ; break ; }
     }
    
// 加载返回值
     Hashtable stats = MemCachedManager.CacheClient.Stats(serverArrayList, commandstr);
    
foreach ( string key in stats.Keys)
     {
         statsArray.Add(key);
         Hashtable values
= (Hashtable)stats[key];
        
foreach ( string key2 in values.Keys)
         {
             statsArray.Add(key2
+ " : " + values[key2]);
         }
     }
    
return statsArray;
}

/// <summary>
/// Stats命令行参数
/// </summary>
public enum Stats
{
    
/// <summary>
    
/// stats : 显示服务器信息, 统计数据等
    
/// </summary>
     Default = 0 ,
    
/// <summary>
    
/// stats reset : 清空统计数据
    
/// </summary>
     Reset = 1 ,
    
/// <summary>
    
/// stats malloc : 显示内存分配数据
    
/// </summary>
     Malloc = 2 ,
    
/// <summary>
    
/// stats maps : 显示"/proc/self/maps"数据
    
/// </summary>
     Maps = 3 ,
    
/// <summary>
    
/// stats sizes
    
/// </summary>
     Sizes = 4 ,
    
/// <summary>
    
/// stats slabs : 显示各个slab的信息,包括chunk的大小,数目,使用情况等
    
/// </summary>
     Slabs = 5 ,
    
/// <summary>
    
/// stats items : 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)
    
/// </summary>
     Items = 6 ,
    
/// <summary>
    
/// stats cachedump slab_id limit_num : 显示某个slab中的前 limit_num 个 key 列表
    
/// </summary>
     CachedDump = 7 ,
    
/// <summary>
    
/// stats detail [on|off|dump] : 设置或者显示详细操作记录    on:打开详细操作记录   off:关闭详细操作记录 dump: 显示详细操作记录(每一个键值get,set,hit,del的次数)
    
/// </summary>
     Detail = 8
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值