.net/c# memcached 擷取所有緩衝鍵(keys)

來源:互聯網
上載者:User

使用組件

memcached 1.2.6

.net 類庫 memcacheddotnet_clientlib-1.1.5

1.增加memcacheddotnet_clientlib-1.1.5代碼

下載好組件後,用vs開啟.net類庫memcacheddotnet_clientlib-1.1.5,開啟MemCachedClient.cs,增加如下方法:

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                if (command == null || command.Length == 0)                {                    command = "stats\r\n";                }                else                {                    command = 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 (line.StartsWith("ITEM"))                        {                                                        string[] info = line.Split('[');                            string key = info[0].Split(' ')[1];                            string val = "[" + info[1];                            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;        }

  2.請看此文章http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html

文章中有GetStats方法,將它修改如下:

/// <summary>        /// 擷取伺服器端緩衝的資料資訊        /// </summary>        /// <param name="serverArrayList">要訪問的服務列表</param>        /// <param name="statsCommand">此參數的功能暫時無效</param>        /// <param name="param">此參數的功能暫時無效</param>        /// <returns>返回資訊</returns>        public static IList<string> GetStats(IList<string> serverArrayList, MemcachedStats statsCommand, string param)        {            IList<string> statsArray = new List<string>();            if (param == null)                param = "";            else            {                param = param.Trim().ToLower();            }            string commandstr = "stats";            //轉換stats命令參數            switch (statsCommand)            {                case MemcachedStats.Reset: { commandstr = "stats reset"; break; }                case MemcachedStats.Malloc: { commandstr = "stats malloc"; break; }                case MemcachedStats.Maps: { commandstr = "stats maps"; break; }                case MemcachedStats.Sizes: { commandstr = "stats sizes"; break; }                case MemcachedStats.Slabs: { commandstr = "stats slabs"; break; }                case MemcachedStats.Items: { commandstr = "stats items"; break; }//此處原先是返回stats                case MemcachedStats.CachedDump:                    {                        string[] statsparams = param.Split(' ');                        if (statsparams.Length == 2)                            if (param.IsIntArr(' '))// Utils.IsNumericArray(statsparams)                                commandstr = "stats cachedump  " + param;                        break;                    }                case MemcachedStats.Detail:                    {                        if (string.Equals(param, "on") || string.Equals(param, "off") || string.Equals(param, "dump"))                            commandstr = "stats detail " + param.Trim();                        break;                    }                default: { commandstr = "stats"; break; }            }            ArrayList arr = new ArrayList(serverArrayList.ToArray());            Hashtable stats = MemcachedManager.CacheClient.Stats(arr, commandstr);            foreach (string key in stats.Keys)            {                statsArray.Add("server:__:" + key);//此處也改了                Hashtable values = (Hashtable)stats[key];                foreach (string key2 in values.Keys)                {                    statsArray.Add(key2 + ":" + values[key2]);                }            }            return statsArray;        }

  3.最後增加如下方法

 /// <summary>        /// 擷取所有緩衝鍵        /// </summary>        /// <returns></returns>        public static IList<string> GetAllKeys()        {            IList<int> idList = new List<int>();            IList<string> list = MemcachedManager.GetStats(MemcachedManager.ServerList, MemcachedStats.Items, null);            foreach (var item in list)            {                string[] tmpArr = item.Split(':');                if (tmpArr.Length > 1)                {                    int itemID = 0;                    if (tmpArr[1] == "__") continue;                    int.TryParse(tmpArr[1], out itemID);                    if (itemID <= 0) continue;                    bool find = false;                    foreach (int item1 in idList)                    {                        if (item1 == itemID)                        {                            find = true;                            break;                        }                    }                    if (!find)                    {                        idList.Add(itemID);                    }                }            }            IList<string> keys = new List<string>();            foreach (int item in idList)            {                IList<string> cachearr = MemcachedManager.GetStats(MemcachedManager.ServerList, MemcachedStats.CachedDump, item + " 0");                foreach (string itemCache in cachearr)                {                    string[] tmpArr = itemCache.Split(':');                    if (tmpArr.Length > 1)                    {                        if (tmpArr[1] == "__")                        {                            continue;                        }                        keys.Add(tmpArr[0]);                    }                }            }            return keys;        }

  調用方法

IList<string> list = MemcachedManager.GetAllKeys();            foreach (var item in list)            {                Response.Write(item + "<br />");            }

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.