繁体   English   中英

如何使用ASP.NET MVC缓存页面的特定部分?

[英]How to cache specific parts of the page with ASP.NET MVC?

我正在网站上进行类似于堆栈溢出的“信誉”类型功能。 我想通过标题中的名称显示它们的点。

我不想每次他们移动到另一个页面时都必须为此进行数据库调用。

谁能建议一种实现此目标的好方法?

不要仅仅为此进行数据库调用,而是在获取其他所有内容时从数据库获取数据。

遵循一个请求响应周期,一个数据库调用的原则。 实际上,这只是联接查询中的其他表的问题。

例如,如果您查看的页面上有一个问题和一堆答案。 您知道原始问题的“用户”,并且知道每个答案和评论的“用户”。 因此,在获取信息的同时,还要加入每个用户的相关信息。 它实际上只是联接其他表,您可以在一个数据库调用中有效地获取所需的所有数据。

调用数据库(例如MSSQL Server)时,可以在一个调用中返回多个结果集,因此,您也不仅限于单个结果集。

编辑:

这是一个示例存储过程(或只是SQL语句),它在一个数据库调用中产生5个结果集。

ALTER PROCEDURE [dbo].[GetPostWithSlug]
@PostSlug varchar(80)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @PostId int;

    SELECT @PostId = PostId
    FROM dbo.Post
    WHERE PostSlug = @PostSlug

    SELECT      PostId, PostDate, PostSlug, dbo.[User].UserFirstName + ' ' + dbo.[User].UserLastName AS PostedBy, PostTitle, PostText, PostIsPublished, PostIsPublic, PostTitleImg, PostUpdatedDate, dbo.[User].UserWebsite AS AuthorWebsite
    FROM        dbo.Post
                INNER JOIN
                    dbo.[User]
                        ON dbo.[User].UserId = dbo.Post.UserId

    WHERE       PostId = @PostId

    /* SubCategories for Post */
    SELECT   dbo.PostSubCategory.PostId, dbo.Category.CategoryId, dbo.SubCategory.SubCategoryId, dbo.Category.CategoryDescription, dbo.SubCategory.SubCategoryDescription
    FROM     dbo.Category
             INNER JOIN
                dbo.SubCategory ON dbo.Category.CategoryId = dbo.SubCategory.CategoryId
             INNER JOIN
                dbo.PostSubCategory ON dbo.SubCategory.SubCategoryId = dbo.PostSubCategory.SubCategoryId
             INNER JOIN
                dbo.Post ON dbo.Post.PostId = dbo.PostSubCategory.PostId
    WHERE   dbo.Post.PostId = @PostId
    ORDER BY dbo.PostSubCategory.PostId

    /* Tags for Post */
    SELECT  dbo.PostTag.PostId, dbo.Tag.TagId, dbo.Tag.TagDescription
    FROM    dbo.PostTag
            INNER JOIN
                dbo.Tag ON dbo.Tag.TagId = dbo.PostTag.TagId
            INNER JOIN 
                dbo.Post ON dbo.Post.PostId = dbo.PostTag.PostId
    WHERE   dbo.Post.PostId = @PostId           
    ORDER BY dbo.PostTag.PostId, dbo.Tag.TagDescription

    /* Custom Groups for Post */
    SELECT dbo.PostCustomGroup.PostId, dbo.CustomGroupHeader.CustomGroupHeaderId, dbo.CustomGroup.CustomGroupId
    FROM dbo.CustomGroup
        INNER JOIN
            dbo.CustomGroupHeader ON dbo.CustomGroupHeader.CustomGroupHeaderId = dbo.CustomGroup.CustomGroupHeaderId
        INNER JOIN
            dbo.PostCustomGroup ON dbo.PostCustomGroup.CustomGroupId = dbo.CustomGroup.CustomGroupId
    WHERE   dbo.PostCustomGroup.PostId = @PostId


    EXEC GetCommentsForPost @PostId
END

在C#代码中,您的DbDataReader将保存多个结果集,可以通过调用NextResult()来获得这些结果集。 或者,如果要填充数据集,则可以简单地使用适配器的Fill方法。

我在我的博客Matlus-Internet Technology and Software Engineering上使用了这种技术,您可以看到该站点有多快(响应)。 在具有大量流量的公共社交网站ExposureRoom上使用了相同的技术。

您正在寻找做甜甜圈孔缓存的方法:

https://stackoverflow.com/search?q=[asp.net-mvc]+donut+hole+caching

如果仅需要缓存页面的一小部分,则可以使用子操作来呈现并缓存该部分。 示例: http//www.asp.net/learn/whitepapers/mvc3-release-notes#_Toc276711791

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM