zoukankan      html  css  js  c++  java
  • ASP.NET Cache 类

    在查找资料的过程中。原来园子里面已经有过分析了。nopCommerce架构分析系列(二)数据Cache。 接下来是一些学习补充。

    1.Nop中没有System.Web.Caching.Cache的实现。原因暂不明。先自己实现一个吧

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Runtime.CompilerServices;
    using System.Web.Caching;
    using System.Collections;
    using System.Text.RegularExpressions;
    
    namespace SDF.Core.Caching
    {
    
        public class CacheManager : ICacheManager
        {
            System.Web.Caching.Cache Cache = HttpRuntime.Cache;
    
            public void Set(string key, object data)
            {
                Cache.Insert(key, data);
            }
            public void Set(string key, object data, DateTime absoluteExpiration, TimeSpan slidingExpiration)
            {
                Cache.Insert(key, data, null,absoluteExpiration, slidingExpiration);
            }
    
            public object Get(string Key)
            {
                return Cache[Key];
            }
    
            public T Get<T>(string key)
            {
                return (T)Cache[key];
            }
    
            public bool IsSet(string key)
            {
                return Cache[key] != null;
            }
    
            public void Remove(string Key)
            {
                if (Cache[Key] != null) {
                    Cache.Remove(Key);
                }
            }
    
            public void RemoveByPattern(string pattern)
            {
                IDictionaryEnumerator enumerator = Cache.GetEnumerator();
                Regex rgx = new Regex(pattern, (RegexOptions.Singleline | (RegexOptions.Compiled | RegexOptions.IgnoreCase)));
                while (enumerator.MoveNext()) {
                    if (rgx.IsMatch(enumerator.Key.ToString())) {
                        Cache.Remove(enumerator.Key.ToString());
                    }
                }
            }
    
            public void Clear()
            {
                IDictionaryEnumerator enumerator = Cache.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    Cache.Remove(enumerator.Key.ToString());
                }
            }
    
        }
    
    }

    2.MemoryCache 和 ASP.NET Cache 区别。

    引用MSDN

    MemoryCache 类类似于 ASP.NET Cache 类。 MemoryCache 类有许多用于访问缓存的属性和方法,如果您使用过 ASP.NET Cache 类,您将熟悉这些属性和方法。 Cache 和 MemoryCache 类之间的主要区别是:MemoryCache 类已被更改,以便 .NET Framework 应用程序(非 ASP.NET 应用程序)可以使用该类。 例如,MemoryCache 类对 System.Web 程序集没有依赖关系。 另一个差别在于您可以创建 MemoryCache 类的多个实例,以用于相同的应用程序和相同的 AppDomain 实例。

    代码更清楚一点:

    [Test]
            public void MemoryCacheTest()
            {
                var cache = new MemoryCache("cache1");
                var cache2 = new MemoryCache("cache2");
                var policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(60);
                cache.Set(new CacheItem("key1", "data1"), policy);
    
                var obj = cache.Get("key1");
                Assert.IsNotNull(obj);
    
                var obj2 = cache2.Get("key1");
                Assert.IsNull(obj2);
            }

    3.Nop中IOC和ICache

    注册CacheManager

    //cache manager
                builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").SingleInstance();
                builder.RegisterType<PerRequestCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_per_request").InstancePerHttpRequest();

    注册Service(可以根据实际需求为Service提供不同的缓存方式。)

    //pass MemoryCacheManager to SettingService as cacheManager (cache settngs between requests)
                builder.RegisterType<SettingService>().As<ISettingService>()
                    .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"))
                    .InstancePerHttpRequest();
                //pass MemoryCacheManager to LocalizationService as cacheManager (cache locales between requests)
                builder.RegisterType<LocalizationService>().As<ILocalizationService>()
                    .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"))
                    .InstancePerHttpRequest();
    
                //pass MemoryCacheManager to LocalizedEntityService as cacheManager (cache locales between requests)
                builder.RegisterType<LocalizedEntityService>().As<ILocalizedEntityService>()
                    .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"))
                    .InstancePerHttpRequest();

    最后是构造器注入

    /// <summary>
        /// Provides information about localizable entities
        /// </summary>
        public partial class LocalizedEntityService : ILocalizedEntityService
        {
         /// <summary>
            /// Ctor
            /// </summary>
            /// <param name="cacheManager">Cache manager</param>
            /// <param name="localizedPropertyRepository">Localized property repository</param>
            public LocalizedEntityService(ICacheManager cacheManager,
                IRepository<LocalizedProperty> localizedPropertyRepository)
            {
                this._cacheManager = cacheManager;
                this._localizedPropertyRepository = localizedPropertyRepository;
            }
        }

    4.Cache的使用

    一段Nop中的代码

    private const string BLOGPOST_BY_ID_KEY = "Nop.blogpost.id-{0}";
           private const string BLOGPOST_PATTERN_KEY = "Nop.blogpost.";
    
    /// <summary>
            /// Gets a blog post
            /// </summary>
            /// <param name="blogPostId">Blog post identifier</param>
            /// <returns>Blog post</returns>
            public virtual BlogPost GetBlogPostById(int blogPostId)
            {
                if (blogPostId == 0)
                    return null;
    
                string key = string.Format(BLOGPOST_BY_ID_KEY, blogPostId);
                return _cacheManager.Get(key, () =>
                {
                    var pv = _blogPostRepository.GetById(blogPostId);
                    return pv;
                });
            }/// <summary>
           /// Updates the blog post
           /// </summary>
           /// <param name="blogPost">Blog post</param>
           public virtual void UpdateBlogPost(BlogPost blogPost)
           {
               if (blogPost == null)
                   throw new ArgumentNullException("blogPost");
    
               _blogPostRepository.Update(blogPost);
    
               _cacheManager.RemoveByPattern(BLOGPOST_PATTERN_KEY);
    
               //event notification
               _eventPublisher.EntityUpdated(blogPost);
           }

    在查找数据时,会先从缓存中读取,更新数据时再清空缓存。 但是在这里Update了一个blogPost对象。没有必要把所有的blogPost缓存全部清空掉。稍微改一下

    /// <summary>
            /// Updates the blog post
            /// </summary>
            /// <param name="blogPost">Blog post</param>
            public virtual void UpdateBlogPostV2(BlogPost blogPost)
            {
                if (blogPost == null)
                    throw new ArgumentNullException("blogPost");
    
                _blogPostRepository.Update(blogPost);
    
                string key = string.Format(BLOGPOST_BY_ID_KEY, blogPost.Id);
                _cacheManager.Remove(key);
    
                //event notification
                _eventPublisher.EntityUpdated(blogPost);
            }

    总结:nop提供了易于扩展的Cache类,以及很好的使用实践。非常有借鉴和学习使用的意义。 只需稍微改造一下就可以用于自己的项目中。

  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/miku/p/2698478.html
Copyright © 2011-2022 走看看