当某个东西缓存在c#asp.net中时,它是缓存在服务器上还是客户端上?

当某个东西缓存在c#asp.net中时,它是缓存在服务器上还是客户端上?,c#,asp.net,performance,caching,singleton,C#,Asp.net,Performance,Caching,Singleton,这可能是一个愚蠢的问题,但它是存储在服务器内存还是客户端内存中 另外,执行上述操作与使用单例之间有什么区别 例如: private Obj CacheSomething() { Obj retVal = (Obj)System.Web.HttpRuntime.Cache["key"]; if (retVal == null) { retVal = new Obj(); System.Web.

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

另外,执行上述操作与使用单例之间有什么区别

例如:

 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;
    }

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

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

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

它缓存在服务器上。 从课堂手册:

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

您可以在这里找到它:

它缓存在服务器上。 从课堂手册:

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

你可以在这里找到它:

  • System.Web.HttpRuntime.Cache
    是服务器端的

  • 当使用
    Singleton
    模式时,您通常编写希望Singleton实例存在的代码。对于缓存项,您永远不能依赖它的存在,应该相应地编写代码。例如,如果
    retVal
    创建是一项耗费时间/资源的工作,则应该
    lock
    以防止其他线程执行构建它的相同工作

  • System.Web.HttpRuntime.Cache
    是服务器端的

  • 当使用
    Singleton
    模式时,您通常编写希望Singleton实例存在的代码。对于缓存项,您永远不能依赖它的存在,应该相应地编写代码。例如,如果
    retVal
    创建是一项耗费时间/资源的工作,则应该
    lock
    以防止其他线程执行构建它的相同工作


  • 要清楚的是,当你说“线程”时,这意味着每个用户都将使用他们自己的线程?因此,如果我使用这个lock关键字,正在缓存的资源将只为所有用户(使用相同资源的所有用户)缓存一次?这就是你所说的吗?来自不同用户的HttpRequest由不同的线程处理,这种处理可能同时发生。如果缓存的值适用于所有人,那么只让这些线程中的一个线程来创建这个缓存对象是有意义的。因为每个试图访问此对象的线程都将执行相同的代码(并且缓存密钥对于代码中的每个人都是相同的),所以是的,所有用户都将使用相同的资源。抱歉,这些问题对您来说可能很明显。最后一个问题——如果我有一个用于实例化类的锁定单例,那么该类只会创建一次,并且每个用户都会使用相同的对象,对吗?因此,如果类根据用户输入生成不同的结果,那么每个用户的所有结果都是相同的吗?如果应用程序对于每个线程/用户的行为应该不同,则不应使用lock关键字。是吗?如果您需要使用用户输入的参数执行代码,那么我将使用静态方法,而不是单例/缓存实例。要清楚,当您说“线程”时,这意味着每个用户将使用自己的线程?因此,如果我使用这个lock关键字,正在缓存的资源将只为所有用户(使用相同资源的所有用户)缓存一次?这就是你所说的吗?来自不同用户的HttpRequest由不同的线程处理,这种处理可能同时发生。如果缓存的值适用于所有人,那么只让这些线程中的一个线程来创建这个缓存对象是有意义的。因为每个试图访问此对象的线程都将执行相同的代码(并且缓存密钥对于代码中的每个人都是相同的),所以是的,所有用户都将使用相同的资源。抱歉,这些问题对您来说可能很明显。最后一个问题——如果我有一个用于实例化类的锁定单例,那么该类只会创建一次,并且每个用户都会使用相同的对象,对吗?因此,如果类根据用户输入生成不同的结果,那么每个用户的所有结果都是相同的吗?如果应用程序对于每个线程/用户的行为应该不同,则不应使用lock关键字。是吗?如果您需要使用用户输入的参数执行代码,那么我将使用静态方法,而不是单例/缓存实例。
    myObj= GenericSingleton<Obj>.GetInstance();
    
    myObj= CacheSomething();