华域联盟 .Net .net/c# memcached缓存获取所有缓存键的方法步骤

.net/c# memcached缓存获取所有缓存键的方法步骤

使用组件

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 文章中有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 />");

            }

您可能感兴趣的文章:

  • C# memcache 使用介绍
  • C# Memcached缓存用法实例详解
  • C#缓存之SqlCacheDependency用法实例总结
  • C# memcached缓存使用实例代码
  • asp.net(C#)遍历memcached缓存对象
  • c# 如何用lock解决缓存击穿
  • C#利用缓存分块读写大文件
  • C#中缓存的基本使用方法
  • C#清除WebBrowser中Cookie缓存的方法
  • C# Cache缓存读取的设置方法

本文由 华域联盟 原创撰写:华域联盟 » .net/c# memcached缓存获取所有缓存键的方法步骤

转载请保留出处和原文链接:https://www.cnhackhy.com/52729.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部