欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

遍歷memcached緩存對(duì)象(C#)

系統(tǒng) 2177 0

STATS命令

出于性能考慮,memcached沒(méi)有提供遍歷功能,不過(guò)我們可以通過(guò)以下兩個(gè)stats命令得到所有的緩存對(duì)象。

1、stats items

顯示各個(gè)slab中item的數(shù)目。

2、stats cachedump slab_idlimit_num
顯示某個(gè)slab中的前l(fā)imit_num個(gè)key列表,顯示格式:ITEM key_name [ value_length b; expire_time|access_time s]

除了上面兩個(gè),memcached還提供了以下命令:

3、stats
4、 stats reset
5、 stats malloc
6、 stats maps
7、 stats sizes
8、 stats slabs
9、 stats detail [on|off|dump]

命令的用法就不一一說(shuō)了,請(qǐng)自行g(shù)oogle。 關(guān)于memcached的數(shù)據(jù)存儲(chǔ)和內(nèi)存分配以后有機(jī)會(huì)再寫。

添加緩存

在本地添加幾個(gè)key,如下:

遍歷memcached緩存對(duì)象(C#)

程序?qū)崿F(xiàn)

因?yàn)橐胏#調(diào)用,所以需要客戶端執(zhí)行 STATS 命令,這個(gè)可以直接參考DiscuzNT3.0中的實(shí)現(xiàn)。

DiscuzNT下載地址:http://download.comsenz.com/DiscuzNT/src/

下載完程序以后,在Discuz.Cache項(xiàng)目中找到這兩個(gè)類:MemCached.cs和MemCachedClient.cs。

我們要用到的方法有:

MemCached.GetStats

代碼
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 獲取服務(wù)器端緩存的數(shù)據(jù)信息
/// </summary>
/// <paramname="serverArrayList"> 要訪問(wèn)的服務(wù)列表 </param>
/// <returns> 返回信息 </returns>
public static ArrayListGetStats(ArrayListserverArrayList,StatsstatsCommand, string param)
{
ArrayListstatsArray = new ArrayList();
param = Utils.StrIsNullOrEmpty(param) ? "" :param.Trim().ToLower();

string commandstr = " stats " ;
// 轉(zhuǎn)換stats命令參數(shù)
switch (statsCommand)
{
case Stats.Reset:{commandstr = " statsreset " ; break ;}
case Stats.Malloc:{commandstr = " statsmalloc " ; break ;}
case Stats.Maps:{commandstr = " statsmaps " ; break ;}
case Stats.Sizes:{commandstr = " statssizes " ; break ;}
case Stats.Slabs:{commandstr = " statsslabs " ; break ;}
case Stats.Items:{commandstr = " stats " ; break ;}
case Stats.CachedDump:
{
string []statsparams = Utils.SplitString(param, " " );
if (statsparams.Length == 2 )
if (Utils.IsNumericArray(statsparams))
commandstr = " statscachedump " + param;

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

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

MemCachedClient.Stats

代碼
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public HashtableStats(ArrayListservers, string command)
{

// getSockIOPoolinstance
SockIOPoolpool = SockIOPool.GetInstance(_poolName);

// returnfalseifunabletogetSockIOobj
if (pool == null )
{
// if(log.IsErrorEnabled)
// {
// log.Error(GetLocalizedString("unabletogetsocketpool"));
// }
return null ;
}

// getallserversanditerateoverthem
if (servers == null )
servers = pool.Servers;

// ifnoservers,thenreturnearly
if (servers == null || servers.Count <= 0 )
{
// if(log.IsErrorEnabled)
// {
// log.Error(GetLocalizedString("statsnoservers"));
// }
return null ;
}

// arrayofstatsHashtables
HashtablestatsMaps = new Hashtable();

for ( int i = 0 ;i < servers.Count;i ++ )
{

SockIOsock = pool.GetConnection(( string )servers[i]);
if (sock == null )
{
// if(log.IsErrorEnabled)
// {
// log.Error(GetLocalizedString("unabletoconnect").Replace("$$Server$$",servers[i].ToString()));
// }
continue ;
}

// buildcommand
command = Discuz.Common.Utils.StrIsNullOrEmpty(command) ? " stats\r\n " :command + " \r\n " ;

try
{
sock.Write(UTF8Encoding.UTF8.GetBytes(command));
sock.Flush();

// maptoholdkeyvaluepairs
Hashtablestats = new Hashtable();

// loopoverresults
while ( true )
{
string line = sock.ReadLine();
// if(log.IsDebugEnabled)
// {
// log.Debug(GetLocalizedString("statsline").Replace("$$Line$$",line));
// }

if (line.StartsWith(STATS))
{
string []info = line.Split( ' ' );
string key = info[ 1 ];
string val = info[ 2 ];

// if(log.IsDebugEnabled)
// {
// log.Debug(GetLocalizedString("statssuccess").Replace("$$Key$$",key).Replace("$$Value$$",val));
// }

stats[key] = val;

}
else if (END == line)
{
// finishwhenwegetendfromserver
// if(log.IsDebugEnabled)
// {
// log.Debug(GetLocalizedString("statsfinished"));
// }
break ;
}

statsMaps[servers[i]] = stats;
}
}
catch // (IOExceptione)
{
// if(log.IsErrorEnabled)
// {
// log.Error(GetLocalizedString("statsIOException"),e);
// }

try
{
sock.TrueClose();
}
catch // (IOException)
{
// if(log.IsErrorEnabled)
// {
// log.Error(GetLocalizedString("failedtoclosesomesocket").Replace("$$Socket$$",sock.ToString()));
// }
}

sock = null ;
}

if (sock != null )
sock.Close();
}

return statsMaps;
}

有了這兩個(gè)方法我們就可以得到memcached中的緩存項(xiàng)了。

基本思路是,先得到cache中所有的item(stats items),再通過(guò)itemid 取出cachekey和cachevalue(stats cachedump)

程序?qū)崿F(xiàn)如下:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private void GetItems()
{
ArrayListitemarr = new ArrayList();

ArrayListarrayList = new ArrayList();
StringBuildersb = new StringBuilder();

foreach ( string server in MemCachedManager.ServerList)
{
arrayList.Add(server);
}
ArrayListarr = MemCachedManager.GetStats(arrayList,MemCachedManager.Stats.Items, null );
foreach ( string a in arr)
{
string []tmparr = a.Split( ' : ' );
if (tmparr.Length > 1 )
{
int item_id = 0 ;
int .TryParse(tmparr[ 1 ], out item_id);

bool find = false ;
foreach ( int item in itemarr)
{
if (item == item_id)
find = true ;
}
if ( ! find && item_id > 0 && item_id != 11211 )
itemarr.Add(item_id);
}
}
foreach ( int item in itemarr)
{
sb.Append( " item " + item + " <br/> " );
ArrayListcachearr = MemCachedManager.GetStats(arrayList,MemCachedManager.Stats.CachedDump, "" + item + " 10 " );
foreach ( string cache in cachearr)
{
sb.Append(cache);
sb.Append( " <br/> " );
}
}
Response.Write(sb.ToString());
}

運(yùn)行程序:

遍歷memcached緩存對(duì)象(C#)

為什么沒(méi)有輸出緩存項(xiàng)呢?

DiscuzNT3.0中的bug

于是我找啊找,發(fā)現(xiàn)是DiscuzNT3.0中的一個(gè)bug導(dǎo)致。

在MemCachedClient.Stats中,有這樣的一段代碼:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> if (line.StartsWith(STATS))
{
string []info = line.Split( ' ' );
string key = info[ 1 ];
string val = info[ 2 ];
stats[key] = val;

}
else if (END == line)
{
break ;
}

原來(lái)是忽略了stats cachedump 的結(jié)果是以ITEM開頭的,所以什么都沒(méi)有輸出。簡(jiǎn)單修改一下:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> if (line.StartsWith(STATS))
{
string []info = line.Split( ' ' );
string key = info[ 1 ];
string val = info[ 2 ];
stats[key] = val;

}
else if (line.StartsWith( " ITEM " ))
{
string []info = line.Split( ' [ ' );
string key = info[ 0 ].Split( ' ' )[ 1 ];
string val = " [ " + info[ 1 ];

stats[key] = val;
}
else if (END == line)
{
break ;
}

再看一下輸出結(jié)果,顯示正常。

遍歷memcached緩存對(duì)象(C#)

遍歷memcached緩存對(duì)象(C#)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩免费在线视频 | 亚洲不卡 | 国产精品久久久爽爽爽麻豆色哟哟 | 激情五月色婷婷在线观看 | 婷婷在线观看网站 | 91成人在线视频 | 一区二区三区免费 | 亚洲福利视频网 | 99riav视频一区二区 | 欧美精品国产第一区二区 | 秋霞伊人| 五月深爱婷婷 | 日本激情视频网站w | 欧美成人网在线综合视频 | 国产精品黄网站免费进入 | 亚洲国产精久久久久久久 | 亚洲精品无码成人A片色欲 亚洲欧美日韩激情在线观看 | 欧美日韩操 | 国产98在线传媒在线视频 | 日本xxww视频免费 | 骚av在线| 久久精品中文字幕 | 亚洲一区二区三 | 91精品国产露脸在线观看 | 日产精品卡二卡三卡四卡乱码视频 | 色六月婷婷 | 91久久久久久久久 | 欧美亚洲另类视频 | 欧美性色综合网 | 久久成人免费观看草草影院 | 九九色播 | 天天操天天射天天操 | 久久久久综合 | 宅男lu666噜噜噜在线观看 | 亚洲精品久久久 | 国产嫩草影院在线观看 | 唐人社电亚洲一区二区三区 | 欧美成人一区二区三区 | 青青热在线观看视频精品 | 亚洲欧美综合人成野草 | 国产精品毛片在线 |