zoukankan      html  css  js  c++  java
  • .NET Memcached Client 扩展获取所有缓存Key

      .NET Memcached Client默认实现中并没有获取所有已经缓存Key的方法,但在业务中有时候需求中需要通过正则删除符合条件的缓存内容,所以就要通过读取已经缓存Key进行相关的匹配,然后删除。通过flush只会让缓存过容过期,但获取Key时还会获取得到,缓存的内容过期同样。但调用Get(key)后,Key才会删除

    下载源码

    namespace Memcached.ClientLibrary
    {
        public partial class MemcachedClient
        {
    
            #region Methods
            public void DeleteByPattern(string pattern)
            {
                var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled);
                var keysToRemove = new List<String>();
    
                foreach (var item in this.Keys)
                    if (regex.IsMatch(item))
                        keysToRemove.Add(item);
    
                foreach (var key in keysToRemove)
                    Delete(key);
            }
            #endregion
    
            #region Property
            /// <summary>
            /// 获取所有缓存的Key
            /// </summary>
            public List<String> Keys
            {
                get
                {
                    List<String> keys = new List<string>();
    
                    SockIOPool pool = SockIOPool.GetInstance(_poolName);
                    if (pool != null && pool.Servers != null && pool.Servers.Count > 0)
                    {
                        foreach (var server in pool.Servers)
                        {
                            var sock = pool.GetConnection((string)server);
                            if (sock == null) continue;
    
                            try
                            {
                                sock.Write(_commandStatsItems);
                                sock.Flush();
                                string line;
                                var items = new List<string>();
                                while (!END.Equals((line = sock.ReadLine()), StringComparison.Ordinal))
                                {
                                    var id = line.Substring(_idIndex, line.LastIndexOf(':') - _idIndex);
                                    if (!items.Contains(id))
                                        items.Add(id);
                                }
    
                                foreach (var id in items)
                                {
                                    sock.Write(UTF8Encoding.UTF8.GetBytes(string.Concat("stats cachedump ", id, " 0
    ")));
                                    sock.Flush();
    
                                    while (!END.Equals((line = sock.ReadLine()), StringComparison.Ordinal))
                                    {
                                        var key = line.Substring(_keyIndex, line.LastIndexOf('[') - 6);
                                        keys.Add(key);
                                    }
                                }
                            }
                            catch
                            {
                                try
                                {
                                    sock.TrueClose();
                                }
                                catch(IOException)
                                {
                                    if(log.IsErrorEnabled)
                                        log.Error(GetLocalizedString("failed to close some socket").Replace("$$Socket$$", sock.ToString()));  
                                }
                            }
                            finally
                            {
                                if (sock != null)
                                    sock.Close();
                            }
    
                        }
    
    
                    }
    
                    return keys;
                }
            }
            #endregion
    
            #region Fields
            private const int _idIndex = 11;
            private const int _keyIndex = 5;
            private readonly byte[] _commandStatsItems = UTF8Encoding.UTF8.GetBytes("stats items
    ");
            #endregion
        }
    }
  • 相关阅读:
    行政区划遮罩 -Leaflet
    WebGIS vs WebGL图形编程
    oracle 中 group by 加强
    Nagios监控服务搭建
    MySQL触发器使用详解
    mybatis--一对多关联
    mybatis--一对一关联查询
    mybatis--实现数据库增删改查
    mybatis--使用接口注解的方式实现Helloword
    mybatis--第一个mybatis程序
  • 原文地址:https://www.cnblogs.com/elzero/p/Memcached_Client_Extensions_All_Keys.html
Copyright © 2011-2022 走看看