zoukankan      html  css  js  c++  java
  • HttpContext.Cache 详解

    提到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文件变化,缓存就失效了!

  • 相关阅读:
    error: use of undeclared identifier 'PyString_AsString'
    CVPR 2019: Generating 3D Adversarial Point Clouds 生成三维对抗点云数据
    from sklearn.lda import LDA/QDA ImportError: No module named lda/qda
    c++编译错误:expected a qualified name after 'typename'
    MAC: cmake 编译错误 ld: library not found for -lXXX
    MAC: CMake compile CloudCompare error:By not providing "FindQt5PrintSupport.cmake" in CMAKE_MODULE_PATH
    Shell文件大小监控脚本
    CVPR 2018 微表情识别论文Enriched Long-term Recurrent Convolutional Network for Facial Micro-Expression Recognition
    Linux CPU使用率查询
    项目打包至tomcat后,上传文件,数据乱码
  • 原文地址:https://www.cnblogs.com/cainiaoguoshi/p/3475932.html
Copyright © 2011-2022 走看看