输出缓存页面包含用户特定信息

时间:2009-10-08 15:00:48

标签: c# .net caching outputcache

我们有几个网站主要使用sql数据库后端进行内容管理。除非用户通过投票或更新(类似于SO)更改内容,否则这些网站大多数时间都在提供静态信息。这些网站都有母版页,其中用户特定信息通常显示在每个页面的顶部(也类似于SO)。

我们希望实现输出缓存,以防止数据库命中在每次请求时从数据库中获取内容,而90%的时间与先前请求(用户信息除外)相同。做这个的最好方式是什么?我显然知道通过控件进行部分缓存,但这意味着将每个页面内容作为控件,我们不想这样做。

有什么建议吗?我假设SO有一个缓存策略来实现这一目标。

1 个答案:

答案 0 :(得分:1)

我之前的一个想法是缓存整个页面,然后使用javascript填写用户特定信息。它最有可能需要一个非常大的重新架构,但收益可能是巨大的。

我写了proof of concept about it,但想法是在iframe中动态呈现用户数据:

<html>  
<head>  
<script type="text/javascript">  
var iData = {};
iData.loggedIn = true;  
iData.username = 'Your Username';  
iData.userLevel = 'Mod';  
</script>  
</head>  
</html>  

然后在您的(缓存的静态)页面中,操作页面:

var iData = window.iframe.iData;
if(!iData.loggedIn)
{
    $('topnav_hidden').style.display = 'none';
    $('topnav_pm').style.display = 'none';
    $('topnav_mcp').style.display = 'none';
    $('topnav_logout').style.display = 'none';
    hideModFunctions();

    var replyLinks = getElementsByClass('reply_links', $('mainTable'), 'span');
    for(var i=0;i<replyLinks.length;i++)
        replyLinks[i].style.display = 'none';

    var replyLinks = getElementsByClass('reply_links', $('basicTable'), 'span');
    for(var i=0;i<replyLinks.length;i++)
        replyLinks[i].style.display = 'none';
}
else
{
    $('fillin_username').innerHTML = iData.username;
    $('topnav_register').style.display = 'none';
    $('topnav_login').style.display = 'none';
    if(iData.userLevel != 'Mod' && iData.userLevel != 'Admin')
        hideModFunctions();
}

现在要明确 - 这对大多数人来说可能不是一种实用的方法,但是如果你真的受到了重击并且你的内容是99%静态的,那么如果你愿意投入大量精力来设置它,那么你可以获得一些巨大收益。