代码之家  ›  专栏  ›  技术社区  ›  Curtis White

缓存投票?

  •  1
  • Curtis White  · 技术社区  · 14 年前

    我正在使用ASP.NET用于高流量站点的控件和Linq到Sql。实际上,这个小部件已经构建好了。但是,它还没有使用缓存。

    1. 像Poll这样的控件是否适合在每个命中的页面上命中数据库?如何将这种性能扩展到20000个用户的规模。假设服务器有2台服务器、一个负载均衡器、现代多核cpu和2 gig的ram。

    2. 对于这种情况,您希望使用哪种类型的缓存?例如,考虑到任何数量的人可以在任何时间间隔内进行投票,并且计算结果需要进行投票的总人数。更麻烦的是,每次加载时,代码都必须命中数据库才能找到用户没有进行的轮询。

    更新:

    那么,让我们来看一个缓存场景。人们可以缓存民意测验(问题),但仍然可能需要访问数据库以获取民意测验(用户的回答)。一种可能是创建一个阴影,同时写入内存存储和数据库存储。

    我想深入了解一下所提供方案的更多细节。例如,如何使用输出缓存、将linq缓存到sql等等,而不仅仅是一般性的。

    4 回复  |  直到 14 年前
        1
  •  0
  •   AHM    14 年前

    我将缓存以下内容:

    • 所有投票id的列表(键类似于“all\u polls”)
    • 所有民意测验及其结果(关键字为“poll<ID>”)

    在页面加载时,获取所有轮询id的列表,使用此用户已完成的轮询的id列表对其进行筛选,然后按id从缓存中请求轮询。

    回发时,我将使轮询的密钥和用户的密钥过期,并提交到数据库。在下一次请求时,缓存中的密钥将丢失,并且将使用更新的结果从数据库中重新创建密钥。如果你想,你也可以直接在回发时更新缓存中的结果,但通常的解决方案是让密钥过期。

    问题主要在于您使用的是两个Web服务器,因此不能将这些项缓存在内存中。在一个Web服务器上更新的轮询在另一个Web服务器上不会过期,除非您在服务器之间采用某种形式的通信来同步它们的缓存。

    我建议使用外部缓存,在这种情况下,我自己使用memcached。如果在每个Web服务器主机上安装memcached服务器,并将应用程序配置为使用两个memcaches,则始终会有一个同步缓存。

    对于C#您可以使用Enyim Memcached客户端(http://memcached.enyim.com/)连接到服务器和Northscale Memcached服务器(http://www.northscale.com/products/memcached.html)对于服务器。

    Enyim和Northscale工具都是免费的(开源的),并且都非常稳定,在生产中非常有用。而且,不,我没有受雇于这两家公司:-)

        2
  •  2
  •   TomTom    14 年前

    SQL Server可以访问多少个数据库/ASP.NET在“典型”减速前处理

    旧规则是:尽可能早地缓存。就像IIS输出缓存胜过其他任何东西一样。数据缓存胜过数据库等。

    更新:

    那么,让我们来看一个缓存场景。人们可以缓存民意测验(问题),但是 可能还需要访问数据库以获取民意测验(用户的回答)。

    并将显著降低服务器负载。

        3
  •  1
  •   Arseni Mourzenko    14 年前

    SQL Server可以访问多少个数据库/ASP.NET在“典型”服务器上减速前处理?

    回答这个问题是不可能的,特别是因为您没有提供任何信息,甚至没有提供您使用的SQL Server版本。

    什么是“典型服务器”?你说的数据库点击率到底是多少?数据库是如何设计的?SQL Server计算机和服务器之间的网络速度是多少ASP.NET服务器?瓶颈到底是什么?SQL事件探查器怎么说?(还有很多类似的问题要问)

    对于这种情况,您希望使用哪种类型的缓存?

    由于要减少对数据库的请求数,请考虑:

    • 如果在回发时缓存要获取的池列表,则不必检查用户是否尚未获取该池:如果该池在列表中,则可以。

    最后,我认为在保存结果时无法避免对数据库的影响。但以前的结果都是这样的 可以

        4
  •  0
  •   brian brinley    14 年前

    至于缓存,这也取决于您的体系结构以及确保用户没有进行投票的重要性。无论何时实现缓存,都会有过时数据的风险,必须权衡这些风险。

    也就是说,如果过时的数据没有那么重要,我会尝试确定什么时候您真的需要与数据库对话,在空闲时间可以做什么,什么是常量。

    1. 应该在执行时验证业务逻辑。你可以部分缓存这些,但最好在你让别人做之前再检查一遍。例如,您可以标识某人尚未进行的投票列表,但当某人希望实际进行投票时,请再次验证此特定投票是否尚未进行。