• Cache缓存


    在大型网站中,缓存、异步、并行 核心。对外提供的一些接口数据,尤其是要注意缓存,避免别循环查数据,导致整个服务器崩溃。

    缓存接口类:

    {
        /// <summary>
        /// Cache manager interface
        /// </summary>
        public interface ICacheManager
        {
            /// <summary>
            /// Gets or sets the value associated with the specified key.
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">The key of the value to get.</param>
            /// <returns>The value associated with the specified key.</returns>
            T Get<T>(string key);
    
            /// <summary>
            /// Adds the specified key and object to the cache.
            /// </summary>
            /// <param name="key">key</param>
            /// <param name="data">Data</param>
            /// <param name="cacheTime">Cache time</param>
            void Set(string key, object data, int cacheTime);
    
            /// <summary>
            /// Gets a value indicating whether the value associated with the specified key is cached
            /// </summary>
            /// <param name="key">key</param>
            /// <returns>Result</returns>
            bool IsSet(string key);
    
            /// <summary>
            /// Removes the value with the specified key from the cache
            /// </summary>
            /// <param name="key">/key</param>
            void Remove(string key);
    
            /// <summary>
            /// Removes items by pattern
            /// </summary>
            /// <param name="pattern">pattern</param>
            void RemoveByPattern(string pattern);
    
            /// <summary>
            /// Clear all cache data
            /// </summary>
            void Clear();
        }

    继续该缓存接口类方法:

    /// <summary>
        /// Represents a MemoryCacheCache
        /// </summary>
        public partial class MemoryCacheManager : ICacheManager
        {
            protected ObjectCache Cache
            {
                get
                {
                    return MemoryCache.Default;
                }
            }
            
            /// <summary>
            /// Gets or sets the value associated with the specified key.
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">The key of the value to get.</param>
            /// <returns>The value associated with the specified key.</returns>
            public T Get<T>(string key)
            {
                return (T)Cache[key];
            }
    
            /// <summary>
            /// Adds the specified key and object to the cache.
            /// </summary>
            /// <param name="key">key</param>
            /// <param name="data">Data</param>
            /// <param name="cacheTime">Cache time</param>
            public void Set(string key, object data, int cacheTime)
            {
                if (data == null)
                    return;
    
                var policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
                Cache.Add(new CacheItem(key, data), policy);
            }
    
            /// <summary>
            /// Gets a value indicating whether the value associated with the specified key is cached
            /// </summary>
            /// <param name="key">key</param>
            /// <returns>Result</returns>
            public bool IsSet(string key)
            {
                return (Cache.Contains(key));
            }
    
            /// <summary>
            /// Removes the value with the specified key from the cache
            /// </summary>
            /// <param name="key">/key</param>
            public void Remove(string key)
            {
                Cache.Remove(key);
            }
    
            /// <summary>
            /// Removes items by pattern
            /// </summary>
            /// <param name="pattern">pattern</param>
            public void RemoveByPattern(string pattern)
            {
                var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                var keysToRemove = new List<String>();
    
                foreach (var item in Cache)
                    if (regex.IsMatch(item.Key))
                        keysToRemove.Add(item.Key);
    
                foreach (string key in keysToRemove)
                {
                    Remove(key);
                }
            }
    
            /// <summary>
            /// Clear all cache data
            /// </summary>
            public void Clear()
            {
                foreach (var item in Cache)
                    Remove(item.Key);
            }
        }

    如果上面的方法还不足够,我们可以进行方法的扩展,如:

    /// <summary>
        /// Extensions
        /// </summary>
        public static class CacheExtensions
        {
            public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
            {
                return Get(cacheManager, key, 60, acquire);
            }
    
            public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire) 
            {
                if (cacheManager.IsSet(key))
                {
                    return cacheManager.Get<T>(key);
                }
                else
                {
                    var result = acquire();
                    //if (result != null)
                        cacheManager.Set(key, result, cacheTime);
                    return result;
                }
            }
        }

    调用的时候,就可以通过不同的KEY来区分了,调用如下:

    /// <summary>
            /// 获取XX列表
            /// </summary>
            /// <param name="prjTypes"></param>
            /// <returns></returns>
            private List<xxxxPrjModel> GetxxxxProject()
            {
                var resultList = new List<xxxxPrjModel>();
    
                //加入5分钟缓存
                resultList = _cacheManager.Get("xxxx_PROJECTLIST", 5, () =>
                {
                    return prjList.ToList();
                });
                return resultList;
            }
  • 相关阅读:
    Ubuntu MP4转MP3 软件:soundconverter
    Jupyter 中添加conda环境
    Pandas 比较两个 DataFrames 是否相同
    苹果ID不能登陆:The action could not be completed. Try again
    awsome node.js
    Cygwin
    library dep
    process
    MSCV version
    cmake_host_system_information
  • 原文地址:https://www.cnblogs.com/wuchitao/p/6486921.html
Copyright © 2020-2023  润新知