欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 18:32:46
使用组件memcached 1.2.6.net 类库 memcacheddotnet_clientlib-1.1.5 1.增加memcacheddotnet_client...

使用组件

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 />");
            }