簡體   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