用于用户过滤结果的服务器端缓存策略

本文关键字:服务器端 缓存 策略 结果 用户 过滤 用于 | 更新日期: 2023-09-27 17:57:56

我在www.zipsory.com(测试版)上遇到了一种情况,我有来自同一数据库的n个提要词条。例如,人们可以获得他们感兴趣的任何城市的信息,这些城市中的许多城市都在一起,因此都是根据最近或最多的选票进行排序的。

当同时有数千个用户时,我应该如何在不完全耗尽可用内存的情况下为每个用户缓存内容?

我唯一的猜测是不要。我可以想出一个客户端缓存策略来整理城市的结果,但通过这种方式,我仍然可以按城市以一刀切的策略进行缓存。

你有什么建议?在这一点上,我处于一个陌生的领域,可以使用一个好的策略。我注意到这个网站并没有这样做,但脸书却这样做了。它们必须从缓存的用户提要池中提取,然后在客户端中提取。不确定,再说一遍,我还不够聪明,还没有弄清楚。

换句话说。。。

每个城市都有自己的食物。每个用户都有一个n个城市提要的组合词条。

我想看看使用c#和ASP.NET 解决这个问题的可能方案


2013年2月28日。以下是我根据你的评论所做的,谢谢!。。。

  • 对于每个登录的用户,我都会缓存他们的首选城市列表
  • 前10个帖子结果按城市缓存,并存储在基于Linq的对象中
  • 当一个用户进来并有x个城市作为提要时,我会遍历他们的城市列表循环,然后检查城市帖子是否在缓存中,如果没有,我会从DB中获取,然后将单个帖子的html与其他排序元素一起填充到缓存中
  • 我将城市列表重新组合为用户的一个提要,因为我在linq对象上有一些排序元素,所以我可以按正确的顺序使用它们并返回给用户

这确实意味着每次都有一些CPU工作,因为我必须将城市列表合并为一个城市列表,但这避免了每次都去数据库,每个人都可以更快地获得页面响应时间。主要的缺点是,因为我以前没有对城市进行过一次查询UNION,如果每个城市都没有缓存,这需要每个城市进行一次查询,但如果每个城市缓存或没有单独缓存,则会对每个城市进行检查,因此只有当网站是一个死区时,才会对每10个城市进行10次查询。

用于用户过滤结果的服务器端缓存策略

根据关键链点判断情况。

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

如果您想使用具有过期和优先级的asp.net缓存,有时内存是一个问题。在这种情况下,当内存出现问题时,缓存随时都可能消失。因此,您可以根据需要再次加载数据(称为LoadThrough),这会影响带宽。在这种情况下,您的代码应该更智能地处理。如果这是你的一个选择,那么尽量少缓存。例如,每个缓存加载的项目,并且当用户请求提要时,检查缓存中是否存在所有项目。否则,您将不得不再次取回全部或丢失的。我过去也做过类似的事情,但无法提供代码。关键是:缓存实体,然后缓存具有实体引用(ID)的提要。因此,当请求特定提要时,您会检查缓存中的所有引用是否仍然有效。顺便说一句,asp.net为这些场景提供了缓存依赖关系,所以也请阅读这篇文章,这可能会有所帮助。

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

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

例如,如果它适合在内存中,则缓存完整的提要集,并且只为每个用户存储他们感兴趣的提要的id

当他们请求订阅源时,只需将其从内存中删除即可。

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

另一种可能是存储通用提要,然后在客户端上进行筛选。这将增加您的带宽,但节省缓存成本。

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