国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - asp.net(C#)遍歷memcached緩存對象

asp.net(C#)遍歷memcached緩存對象

2019-07-15 09:59ASP.NET之家 ASP.NET教程

出于性能考慮,memcached沒有提供遍歷功能,不過我們可以通過以下兩個stats命令得到所有的緩存對象。

STATS命令 

遍歷memcached緩存對象(C#)轉(zhuǎn)載之青草堂 
出于性能考慮,memcached沒有提供遍歷功能,不過我們可以通過以下兩個stats命令得到所有的緩存對象。 
1、stats items 

顯示各個slab中item的數(shù)目。 
2、stats cachedump slab_id limit_num 
顯示某個slab中的前l(fā)imit_num個key列表,顯示格式:ITEM key_name [ value_length b; expire_time|access_time s] 
除了上面兩個,memcached還提供了以下命令: 

3、stats 
4、 stats reset 
5、 stats malloc 
6、 stats maps 
7、 stats sizes 
8、 stats slabs 
9、 stats detail [on|off|dump] 
命 令的用法就不一一說了,請自行g(shù)oogle。 關(guān)于memcached的數(shù)據(jù)存儲和內(nèi)存分配以后有機會再寫。 

添加 緩存 
在本地添加幾個key,如下: 
asp.net(C#)遍歷memcached緩存對象
程序?qū)崿F(xiàn) 
因為要用c#調(diào)用,所以需要客戶端執(zhí)行 STATS 命令,這個可以直接參考DiscuzNT3.0中的實現(xiàn)。 
DiscuzNT下載地址:http://download.comsenz.com/DiscuzNT/src/ 
下載完程序以后,在Discuz.Cache項目中找到這兩個類:MemCached.cs和MemCachedClient.cs。 
我們要用到的方法有: 
MemCached.GetStats 
代碼 

復(fù)制代碼代碼如下:


/// <summary> 
/// 獲取服 務(wù)器端緩存的數(shù)據(jù)信息 
/// </summary> 
/// <param name="serverArrayList">要訪問的服務(wù)列表</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"; 
//轉(zhuǎn)換stats命令參數(shù) 
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; 


MemCachedClient.Stats 
代碼 

復(fù)制代碼代碼如下:


public Hashtable Stats(ArrayList servers, string command) 

// get SockIOPool instance 
SockIOPool pool = SockIOPool.GetInstance(_poolName); 
// return false if unable to get SockIO obj 
if(pool == null) 

//if(log.IsErrorEnabled) 
//{ 
// log.Error(GetLocalizedString("unable to get socket pool")); 
//} 
return null; 

// get all servers and iterate over them 
if (servers == null) 
servers = pool.Servers; 
// if no servers, then return early 
if(servers == null || servers.Count <= 0) 

//if(log.IsErrorEnabled) 
//{ 
// log.Error(GetLocalizedString("stats no servers")); 
//} 
return null; 

// array of stats Hashtables 
Hashtable statsMaps = new Hashtable(); 
for(int i = 0; i < servers.Count; i++) 

SockIO sock = pool.GetConnection((string)servers[i]); 
if(sock == null) 

//if(log.IsErrorEnabled) 
//{ 
// log.Error(GetLocalizedString("unable to connect").Replace("$$Server$$", servers[i].ToString())); 
//} 
continue; 

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

sock.Write(UTF8Encoding.UTF8.GetBytes(command)); 
sock.Flush(); 
// map to hold key value pairs 
Hashtable stats = new Hashtable(); 
// loop over results 
while(true) 

string line = sock.ReadLine(); 
//if(log.IsDebugEnabled) 
//{ 
// log.Debug(GetLocalizedString("stats line").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("stats success").Replace("$$Key$$", key).Replace("$$Value$$", val)); 
//} 
stats[ key ] = val; 

else if(END == line) 

// finish when we get end from server 
//if(log.IsDebugEnabled) 
//{ 
// log.Debug(GetLocalizedString("stats finished")); 
//} 
break; 

statsMaps[ servers[i] ] = stats; 


catch//(IOException e) 

//if(log.IsErrorEnabled) 
//{ 
// log.Error(GetLocalizedString("stats IOException"), e); 
//} 
try 

sock.TrueClose(); 

catch//(IOException) 

//if(log.IsErrorEnabled) 
//{ 
// log.Error(GetLocalizedString("failed to close some socket").Replace("$$Socket$$", sock.ToString())); 
//} 

sock = null; 

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

return statsMaps; 


有了這兩個方法我們就可以得到memcached中的緩存項了。 
基本思路是,先得到cache中所有的item(stats items),再通過itemid 取出cachekey和cachevalue(stats cachedump) 
程序?qū)崿F(xiàn)如下: 

復(fù)制代碼代碼如下:


private void GetItems() 

ArrayList itemarr = new ArrayList(); 
ArrayList arrayList = new ArrayList(); 
StringBuilder sb = new StringBuilder(); 
foreach (string server in MemCachedManager.ServerList) 

arrayList.Add(server); 

ArrayList arr = 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 />"); 
ArrayList cachearr = MemCachedManager.GetStats(arrayList, MemCachedManager.Stats.CachedDump, "" + item + " 10"); 
foreach (string cache in cachearr) 

sb.Append(cache); 
sb.Append("<br />"); 


Response.Write(sb.ToString()); 


運行程序: 
asp.net(C#)遍歷memcached緩存對象
為什么沒有輸出緩存項呢? 

DiscuzNT3.0中的bug 

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

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

復(fù)制代碼代碼如下:


if(line.StartsWith(STATS)) 

string[] info = line.Split(' '); 
string key = info[1]; 
string val = info[2]; 
stats[ key ] = val; 


else if(END == line) 

break; 


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

復(fù)制代碼代碼如下:


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é)果,顯示正常。 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕在线一区二区三区 | 欧美日本韩国一区二区三区 | 成人久久久 | 国产福利91精品一区二区 | 黄大片在线观看 | 成人免费一区二区三区视频网站 | 国产成人一区二区在线观看 | 日韩精品一区二区三区中文字幕 | 亚洲成人av | 国产狂做受xxxxx高潮 | 亚洲xxxxx| 99精品欧美一区二区三区综合在线 | 国产精品国产 | 国产高清一区二区 | 巴西性猛交xxxx免费看久久久 | 91视频免费看| 免费的黄色网 | 国产啊女在线观看 | 亚洲男女视频在线观看 | 免费在线观看黄色av | 国内精品久久久久 | 日本一区二区精品 | 一区二区国产在线观看 | 九九re| 久久久777| 亚洲国产精品久久久久 | 欧日韩在线视频 | 精品中文字幕一区二区三区av | 免费黄色在线 | 国产一区二区免费 | 欧美日韩国产一区二区三区 | 4h影院| 亚洲黄色在线 | 国产片在线看 | 久草免费在线视频 | 成人在线观看网站 | 国产欧美日韩综合精品一区二区 | 澳门黄色网 | 粉嫩视频在线观看 | 国产在线精品一区二区三区 | 日日夜夜精品视频 |