用户筛选结果的服务器端缓存策略

时间:2013-02-06 20:33:58

标签: c# asp.net caching

我遇到www.zipstory.com(beta)的情况,我有来自同一数据库的n个排列。例如,某人可以获得他们感兴趣的任何城市的饲料以及这些城市中的所有城市,所有这些都按最近或最多的投票排序。

当同时有数千名用户时,如何在不完全消除可用内存的情况下为每个用户缓存内容?

我的唯一猜测是不要。我可以提出一个客户端缓存策略,在那里我整理城市结果,但这样我仍然可以按城市缓存一个适合所有策略。

您建议采用哪些方法?我现在处于陌生的境地,可以使用一个好的策略。我注意到这个网站没有这样做,但Facebook确实如此。他们必须从缓存的用户提要池中提取并在客户端提取它们。不确定,我还不够聪明,不知道这个。

换句话说......

每个城市都有自己的饲料。每个用户都有一个城市馈送的n个排列组合。

我希望看到使用c#和ASP.NET

解决此问题的可能方法

添加到2013年2月28日。这是我根据您的意见做的事情,所以感谢!...

  • 对于每个登录的用户,我都会缓存他们的首选城市列表
  • 前10个帖子结果按城市缓存并存储在基于Linq的对象
  • 当用户进来并将x个城市作为供稿时,我会查看他们的城市列表循环然后检查城市过帐是否在缓存中,如果没有,我从DB获取然后将单个发布的html填充到缓存中以及其他排序元件。
  • 我将城市列表重新组合为用户的一个Feed,因为我在linq对象上有一些排序元素,我可以按照正确的顺序求助它们并回馈给用户

这确实意味着每次都有一些CPU工作,无论我必须将城市列表组合到一个城市列表中,但这样可以避免每次都进入数据库,每个人都可以获得更快的页面响应时间。主要的缺点是,由于我之前没有对城市进行单一查询UNION,如果每个城市都没有被缓存,则需要每个城市进行一次查询,但是如果每个城市都被单独缓存或者不单独检查,那么每10个城市的10个查询只会发生。该网站是一个死区。

3 个答案:

答案 0 :(得分:2)

仅缓存每个用户所需的最少量不同信息。

例如,如果它适合内存,则缓存完整的供稿集,并且仅按用户存储他们感兴趣的供稿的ID。

当他们请求他们的提要时,只是让那些内存不足。

答案 1 :(得分:2)

根据关键链点判断情况。

如果内存不是问题,请考虑缓存整个Feed并从中检索项目。为此,您可以使用分布式缓存解决方案。其中一些甚至是免费的。从memcached http://memcached.org/开始。人们将此方法称为 Load Ahead

如果你想使用带有过期和优先级的asp.net缓存,有时内存 是一个问题。在这种情况下,当内存成为问题时,缓存可能在任何时候消失。因此,您可以根据需要再次加载数据(称为 Load Through ),这会影响带宽。在这种情况下,您的代码应该更聪明地相处。如果这是您的选项,请尝试尽可能少地缓存。例如缓存已加载的项目以及用户请求提要时,检查缓存中是否存在所有项目。如果没有,您将不得不再次获取所有或缺少的。我过去做过类似的事情,但无法提供代码。关键点是:缓存实体,然后缓存带有对实体的引用(ID)的提要。因此,当请求特定的源时,您检查所有引用在缓存中是否仍然有效。顺便说一句,asp.net为这种情况提供了缓存依赖关系,所以也请阅读 - 可能会有所帮助。

在任何情况下,在实现数据访问层时都要考虑 Decorator 设计模式,这将允许您:1 - 推迟后续开发阶段的缓存问题,以及2 - 在上面描述的两种方法取决于事情的进展。我将从更简单(和更便宜)的内置解决方案开始,然后在真正需要时切换到分布式缓存解决方案。

答案 2 :(得分:1)

您是否考虑过缓存通用Feed并对其进行标记。然后按用户,您只需存储对该标记/关键字的引用。

另一种可能性是存储通用Feed,然后在客户端上进行过滤。这将增加您的带宽,但可以节省缓存成本。

如果您使用的是HTML5,请使用本地存储来保持用户偏好。