2013-02-06 39 views
4

我有一个www.zipstory.com(测试版)的情况,其中有来自同一数据库的订阅源的n个排列。例如,某人可以为他们感兴趣的任何城市获取饲料,并且将这些城市中的许多城市都集中在一起,以便按最近或最多的投票排序。用户过滤结果的服务器端缓存策略

我应该如何缓存每个用户的东西,而同时又有成千上万的用户没有完全清空可用内存?

我唯一的猜测就是不要。我可以想出一个客户端缓存策略,在这里我可以对城市结果进行分类,但这种方式我仍然可以缓存城市中的所有策略。

你有什么建议?我现在处于陌生的境地,可以使用一个好的策略。我注意到这个网站并没有这样做,但Facebook做到了。他们必须从缓存的用户提要池中提取数据并在客户端采集它们。不知道,我还没有足够的智慧来解决这个问题。

换句话说......

每个城市都有自己的饲料。每个用户都有一个城市饲料组合n置换。

我想使用C#和ASP.NET


添加到这个Febuary 28日看到这个问题可能的解决方案,2013年这里是根据您的意见,以便THANKS!...

我做了什么
  • 对于每一个用户登录时,我缓存他们的首选城市名单
  • 前10后结果每个城市缓存并存储在基于LINQ对象
  • 当一个用户进来并有x个城市作为提要,我浏览他们的城市列表循环,然后检查城市发布是否在缓存中,如果没有,我从数据库中获得,然后将个别发布的html与其他排序元素一起填充到缓存中。
  • 我重组城市名单成为一个进用户,因为我有LINQ对象的一些排序的元素,我可以以适当的顺序求助于他们,并回馈给用户

这并不意味着每次都有一些CPU工作,无论我需要将城市列表合并到一个城市列表中,但这样可以避免每次都进入数据库,并且每个人都可以在更快的页面响应时间中获益。主要缺点是因为我之前没有在城市做单个查询UNION,所以如果每个城市没有被缓存但是每个城市被检查是否被单独缓存,那么每个城市需要单个查询,因此每10个城市的10个查询只会发生在该网站是一个死亡区。

+0

不知道我明白。但是,不应该为每个开发者缓存,而是针对每个“过滤器”缓存?如果两个用户具有相同的“过滤器”,他们共享缓存。就像OutputCache(VaryByParam = filter) –

+0

抱歉不要混淆。每个用户都有自己的城市Feed排列。每个城市都有自己的饲料。 –

+0

@dash多彩的评论有时是适当的,可以增加一个娱乐价值,否则干燥的论坛提供了高雅的工作。否则,我不认为有理由将其删除。 –

回答

2

根据关键链点判断情况。

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

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

在任何情况下,实施数据访问层时具有记装饰设计图案,这将允许:1 - 推迟缓存涉及用于后来的发展阶段,和2 - 上述两种方法之间切换取决于事情进展情况。我会从更简单(更便宜)的内置解决方案开始,然后在真正需要时切换到分布式缓存解决方案。

2

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

举例来说,如果它装入内存,缓存成套饲料和单店的,每个用户,饲料的ID的他们感兴趣的内容。

当他们要求他们的饲料,只是让那些出的记忆。

+0

所以基本上,我需要有一个内存中类型的数据库查询功能。我可以在LINQ中使用对象来完成此操作,就像我在电子商务方面所做的一样。你有关于具体实施方法的建议吗?你的代表太高了,看起来并不在意分数,但我至少会把这个分数加到+50。 –

+0

@ zipstory.com - 任何真的。只需一个'列表'和'列表'或任何您想要使用的数据结构。 LINQ在这里使用是正确的。 – Oded

1

您是否考虑过高速缓存通用订阅源,并对它们进行标记。然后,每个用户只需存储对该标签/关键字的引用。

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

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