【问题标题】:When something is cached in c# asp.net is it cached on the server or the client?当某些东西被缓存在 c# asp.net 中时,它是缓存在服务器上还是客户端上?
【发布时间】:2012-11-28 02:12:10
【问题描述】:
 private Obj CacheSomething()
    {
       Obj retVal = (Obj)System.Web.HttpRuntime.Cache["key"];

        if (retVal == null)
        {
            retVal = new Obj();
            System.Web.HttpRuntime.Cache["key"] = retVal;
        }
        return retVal;
    }

这可能是一个愚蠢的问题,但它是存储在服务器内存还是客户端内存中?

另外,做上述和使用单例有什么区别?

例如:

myObj= GenericSingleton<Obj>.GetInstance();

myObj= CacheSomething();

当我每次声明一个新对象时显然需要更长的时间,但是上述两种方法都比不缓存和不使用单例要快。使用单例基本上是缓存吗?

【问题讨论】:

    标签: c# asp.net performance caching singleton


    【解决方案1】:

    它被缓存在服务器上。最显着的区别是,由于内存压力,或者因为您在插入时指定了过期或依赖信息,项目可能会从缓存中被逐出。

    【讨论】:

      【解决方案2】:
      1. System.Web.HttpRuntime.Cache 是服务器端的。

      2. 当使用Singleton 模式时,您通常会编写期望单例实例存在的代码。使用缓存项,您永远不能依赖它的存在,并且应该相应地编写代码。例如,如果retVal 的创建是一个时间/资源消耗,你应该lock 以防止其他线程做同样的工作来构造它。

      【讨论】:

      • 明确一点,当您说“线程”时,这意味着每个用户都将使用自己的线程?那么如果我使用这个 lock 关键字,被缓存的资源只会为所有用户缓存一次(所有用户使用相同的资源)?你说的是这个吗?
      • 来自不同用户的HttpRequest由不同的线程处理,这个处理可能同时发生。如果缓存值适用于所有人,那么只让这些线程中的一个来完成创建此缓存对象的工作是有意义的。因为每个试图访问该对象的线程都会执行相同的代码(并且代码中的每个人的缓存键都是相同的),所以是的,所有用户都将使用相同的资源。
      • 抱歉,这些问题对您来说似乎很明显。最后一个问题 - 如果我有一个用于实例化类的锁定单例,那么该类只会被创建一次,并且每个用户都会正确使用同一个对象吗?因此,如果该类要根据用户输入生成不同的结果,那么每个用户的所有结果是否都相同?如果应用程序应该对每个线程/用户表现不同,则不应使用 lock 关键字。对吗?
      • 如果您需要使用用户输入的参数执行代码,那么我会使用静态方法而不是单例/缓存实例。
      【解决方案3】:

      它被缓存在服务器上。 来自课堂手册:

      每个应用程序域都会创建一个此类的实例,只要应用程序域保持活动状态,它就会保持有效。有关此类实例的信息可通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性获得。

      你可以在这里找到它:Cache Class

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 2016-08-25
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        相关资源
        最近更新 更多