解决方案 »

  1.   

    基本上可以去掉Session了,分布式的话可以使用Nosql来模拟缓存的存储。可能在个别的应用场景上,还会需要session,比如分布式系统中的 验证码 功能的实现,在一些系统中就会使用Session共享的功能
      

  2.   

    +1另外,Session可以使用,但需要使用共享的Session,如使用数据库的
      

  3.   

    目前这种结构(服务器A+服务器B),就是楼上各位所说的集群+负载均衡。
    1)我因为没有在程序中使用session变量,所以不需要担心在web.confi设置sessionstate的问题?
    2)我在程序中用了Cache变量,就是asp.net中的Cache object, 这个可以用在集群结构当中吗?
      

  4.   


    1 跳过,不用的话配不配都无所谓,默认Inproc
    2这个看你的A\B是什么样的负载策略了,以及你的Cache究竟放的是什么值了,不同情况区分可行性,webcaching?MemoryCache?
      

  5.   

    我有两个Cache,一个在Application_Start,一个在Page_Load1) Application_Start
    if (Cache["Tes1"] == null) 
    {
        Cache.Insert("Test1", txtFile1, null, DateTime.Now.AddHours(24), Cache.NoSlidingExpiration);
    }
    2) Page_Load
    if (Cache["Tes2"] == null) 
    {
        Cache.Insert("Test2", txtFile2, null, DateTime.Now.AddHours(24), Cache.NoSlidingExpiration);
    }
      

  6.   

    1. 不使用,当然不需要设置。
    2. 你的Cache本就是针对单个服务器的,不用考虑跨服务器。实际上跨服务器的那种,也不叫Cache了,应该叫做“使用了一种内存数据库”。而且有了网络通讯的性能损失。不过使用Cache,重点是要测试缓存依赖项是否成立。如果数据库变了,1秒钟之后缓存里还可访问到脏数据,那么这个Cache机制就是败了。基于这个Cache其实并不容易(“缓存”绝不是“把数据放在内存里”这么简单),所以许多时候得承认还没有能力进行高命中率的缓存,不得不暂时放弃缓存。
      

  7.   

    “24小时”本身没有什么意义。设置Duration只是数据的“最长生命期”,跟缓存单元的真正管理差太远了。比如说csdn各栏目的首页列表,可以设置10分钟Duration。但是这不意味着10分钟之后才能变化,Duration只是缓存单元的最长生命期。它还必须设置其它CacheDependency来保证数据“不肮脏”才行,例如本地某个文件变化时清空对应的栏目的首页列表,或者数据库某个表变化时清空对应的栏目的首页列表,等等。缓存单元也完全没有必要区分什么“Application启动时、Page对象创建时”创建。就在第一次sql语句查询之后创建之后把sql语句本身作为key(或者其md5作为key),把查询结果作为缓存数据,就行了当再一次进行sql查询之前,先从Cache.Contains(key)查找(或者Cache[key]读取),如果没有才真正去进行sql查询。Cache中的数据不是一个什么DataTable用来再次反复Select查找的,缓存中的数据本身就是最底层查找的最终结果。如果你是纠结于“Apllication启动还是页面创建时”创建缓存单元,可见你是把一大堆垃圾数据存到内存里,既不考虑命中率、也不考虑数据变脏的情况。
      

  8.   

    比如说假设csd有2千万帖子,同一个帖子可能同时出现在不同的“栏目首页列表”中,每一个栏目首页列表作为一个缓存单元其实就是一个sql查询对应结果。并不纠结于同一个帖子会出现在多个缓存单元中,更不是“一开始把2千万帖子都读取到服务器内存中”才叫做缓存。比如说应用程序以“用户[kksi28237423]的注册资料”为key保存了一个UserInfomation类型的对象数据,那么当读取同样用户id的资料时就会首先读取缓存中的数据。在内存中并不是一开始就保存所有用户的资料,而是仅仅暂时缓存“个别的、曾经查询过的”用户资料而已。这样的缓存可以使用key高速查询“是否存在”缓存数据。系统随时会根据各种CacheDependency,或者物理内存使用情况等等限制,自动清理上万、数十万缓存单元,目的还是因为缓存系统可以保证用服务器里一点内存(比如说1G内存)而高效率地对多达1000G的数据进行有选择的、仅针对“最近查询结果”的缓存(而不是一股脑地把1000G内存弄到内存中)。如果你把一大堆数据弄到一个缓存单元里,相当于你为了存款方便而买下了整个银行,等于滥用了内存,那还不如直接声明你的程序中一个 static 变量不就行了嘛,何必要赶时髦而使用什么Cache呢?
      

  9.   

    你这个是一个相当复杂的课题。不要考虑两个服务器上同步的问题,而是要保证,每一个request都是单独,没有依赖关系。也就是说上一个request发到了A,下一个request发到了B,后一个request不依赖于第一个request。