c# - 按需加载缓存

标签 c# .net caching redis architecture

我们的系统内部有一个社交网络,我们已经实现了一个时间线来向用户展示他们可以看到的内容(来自其他用户和他所属社区的帖子)。鉴于我们有一些 linq-to-sql 查询命中数据库,它工作正常,用户可以执行诸如对帖子的评论喜欢 帖子。我们在 javascript 上还有一个间隔计时器,它请求对时间线进行一些更新(让用户看到新帖子等)。时间线被制作成无限滚动加载 10 x 10(根据用户可以看到的内容)。

我们想提高这个方法的性能,我们正在考虑如何缓存时间线。主要问题是我们有很多 posts(超过 10000 strip 有评论和点赞)并且缓存整个 post 表不是一个好主意。我们已经对其进行了测试并获得了糟糕的性能,因为我们的缓存变得很大并且使用 linq(在内存中)处理页面很慢。

是否知道我们如何根据需求和基于用户加载缓存?或者还有其他选择。

我们可以使用 Redis 或 .Net MemoryCache 实现。

谢谢。

最佳答案

没有人会滚动浏览整个历史记录,无需将所有内容加载到缓存中。

每次用户请求一个新页面时,如果它不在缓存中则加载它,并将接下来的 10 个项目加载到缓存中。这样,第一个请求是唯一一个可能对每个用户来说都很慢的请求。

同时在每个页面上设置一个过期日期,如果在 X 时间单位内没有人请求它,则将其从缓存中删除。

请注意,创建新项目时必须重新排序页面(第一页中最旧的条目必须移至第二页等)。 (或者只是将所有内容都保存在一个列表中,但是使用一个列表实现,当在位置 0 插入某些内容时不会强制移动项目)

关于c# - 按需加载缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52879516/

相关文章:

c# - MVC 6 中的 JsonResult 未收到任何响应

c# - 在单独的线程中更新 ObservableCollection

caching - Kubernetes 中每个 pod 的页面缓存大小

css - 在 Vaadin 8.1 元素中忽略版本控制的 'styles.scss.cache' 文件?

c# - C# 中的排序列表替代项

c++ - 虚假分享会导致错误的结果吗?

c# - 如何在 C# 中从指向内存流的 int 指针获取数据?

c# - 在 Selenium Webdriver 中读取分页数据网格

c# - Entity Framework /LINQ 错误 : The column prefix 'Project1' does not match with a table name or alias name used in the query

c# - .NET应用程序无异常退出0x4000001f