提到HttpContext.Cache必然会想到Application,他们有什么共性和不同点呢,我们一一道来

  • 相同点:

1、两者都是使用键值对来存储对象

2、两者都是应用程序同生命周期(在cache不设置缓存策略的情况下)

  • 不同点

1、锁的方式:application采用lock,unlock来控制脏操作

                    Cache内部自动完成锁定高效率

我们做一个最简单的比较,测试读取999999次,这只是单线程的

 

  public void ApplicationTime()
        {
            for (int i = 0; i < 999999; i++)
            {
                var s = HttpContext.Application["Name"];
            }
        }

        public void CacheTime()
        {

            for (int i = 0; i < 999999; i++)
            {
                var s = HttpContext.Cache["Name"];
            }
        }


        //
        // GET: /Home/
        public ActionResult Index()
        {
            
            HttpContext.Application["Name"] = "张三";
            HttpContext.Cache["Name"] = "张三";
            Stopwatch swApplication= new Stopwatch();
            swApplication.Start();
            ApplicationTime();
            swApplication.Start();
           var applicationLong= swApplication.ElapsedMilliseconds;

            Stopwatch swCache = new Stopwatch();
            swCache.Start();
            CacheTime();
            swCache.Start();
            var cacheLong = swCache.ElapsedMilliseconds;

 applicationLong:1373  cacheLong:925

单线程无法说明太多的问题,我们来看一个多线程的

   public  List<Thread> applicationThreads = new List<Thread>();
       public List<Thread> cacheThreads = new List<Thread>();

        public void ApplicationTime()
        {
            for (int i = 0; i < 19999; i++)
            {
                var s = HttpContext.Application["Name"];
            }
            applicationThreads.Remove(Thread.CurrentThread);
        }

        public void CacheTime()
        {
            for (int i = 0; i < 19999; i++)
            {
                var s = HttpContext.Cache["Name"];
            }
            cacheThreads.Remove(Thread.CurrentThread);
        }

        public void CachePool()
        {
            Stopwatch  stopwatch=new Stopwatch();
            stopwatch.Start();
            while (cacheThreads.Count > 0)
            {

            }
            stopwatch.Stop();
            var time = stopwatch.ElapsedMilliseconds;
        }

        public void ApplictionPool()
        {

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            while (applicationThreads.Count > 0)
            {

            }
            stopwatch.Stop();
            var time = stopwatch.ElapsedMilliseconds;
        }


        //
        // GET: /Home/
        public ActionResult Index()
        {
            HttpContext.Application["Name"] = "张三";
            HttpContext.Cache["Name"] = "张三";
            for (int i = 0; i < 100; i++)
            {
                Thread threadApplication = new Thread(ApplicationTime);
                threadApplication.Name = "Application" + i;
               applicationThreads.Add(threadApplication);
                threadApplication.Start();
            }

            Thread applicationPool = new Thread(ApplictionPool);
            applicationPool.Start();

            for (int i = 0; i < 100; i++)
            {
                Thread threadCache = new Thread(CacheTime);
                threadCache.Name = "Cache" + i;
                cacheThreads.Add(threadCache);
                threadCache.Start();
            }

            Thread cachePool = new Thread(CachePool);
            cachePool.Start();

            return View();
        }

 我起了100个线程,每个线程读取19999次缓存,Application:37,Cache:8;如果读取次数增大,差距就更大

2、可以设置不同的缓存依赖策略

 string path = Server.MapPath("/Test/Power.xml");
            CacheDependency  cacheDependency=new CacheDependency(path);
            HttpContext.Cache.Insert("power", "权限", cacheDependency);

Power.xml文件变化,缓存就失效了!