如何为Angular SPA实施缓存

时间:2019-04-17 07:12:43

标签: angular caching asp.net-core single-page-application azure-app-service-envrmnt

我正在使用ASP.NET核心中的后端开发Angular 7应用程序。应用程序托管在Azure应用程序服务中,SQL数据库也在那里。我注意到有些表很少更改,例如“国家”表,但是另一方面,我需要在SPA中经常使用它们。我想知道哪种缓存解决方案适合我的情况。

到目前为止,我还没有尝试任何具体的操作。据我了解,如果我将国家/地区缓存在SPA上,则在用户重新加载页面并重新启动应用程序之前,我将无法访问新添加的国家/地区(有时会发生)。我知道像Redis缓存这样的服务可以解决这个问题,但是它非常昂贵。由于Azure App服务可以扩展,因此我想我也不能使用SignarR之类的解决方案。我当时在考虑使用推送通知,例如https://www.telerik.com/blogs/push-notifications-in-asp-net-core-with-angular

我想听听我是否对自己的担忧是对的,这是一个推荐的解决方案,有正反两方面,请:)

1 个答案:

答案 0 :(得分:0)

我相信您可以通过Dot net core api来获取国家/地区列表。我认为您应该缓存实际上正在获取国家/地区列表的api调用。

尽管这些应用程序都是由数据驱动的,并且看上去确实是动态的,但在同一用户会话中真正发生的变化并不多,但是无论如何我们都向http请求新内容。

最简单的解决方案是缓存 缓存在哪里?在服务器上?但这并不能阻止我们所有的应用程序都袭击我们的服务,因此—增加它们的负载。

也许我们可以使用Service Worker,因为它允许缓存API调用? 是的,这是一种选择,因为它已经与Angular进行了很好的集成,并且允许使用简单的解决方案来选择性地缓存资源和API。但是,我们想要的是不仅能够选择要缓存的内容,还可以选择何时进行缓存。

我们实际上可以缓存所有API调用结果,但前提是我们确定数据源没有以某种方式更改。

如果您使用的是Angular和Typescript,并且我们所有的数据调用都通过RxJ进行,我们可以创建一个Cache Observable装饰器,该装饰器仅用于为某些方法提供缓存功能。

之前:

getCountry(take?: number, skip?: number) {
    return this.http.get(
      `${environment.api}/Country/latest?take=${take}&skip=${skip}`
    );
  }

它将变为:

@Cacheable({
    cacheBusterObserver: CountryNotifier
  })
  getCountry(take?: number, skip?: number) {
    return this.http.get(
      `${environment.api}/Country/latest?take=${take}&skip=${skip}`
    );
  }

请注意,@ Cacheable()仅应用于我们想要的方法,并且还传递了cacheBusterObserver,这基本上是我们基于主题的机制,可以告诉该精确修饰的方法释放任何值时的缓存那个流。

例如,如果下面的方法返回的Observable发出值,则下面的方法将“缓存”上面方法的缓存

@CacheBuster({
    cacheBusterNotifier: countryNotifier
  })
  saveCountry(id: string, name: string, review: string) {
    return this.http.put(`${environment.api}/Country`, {
      id,
      name,
      review
    });
  }

这可能是最复杂的示例,但是我们还实现了其他配置,例如maxCacheCount,maxAge,slideExpiration以及自定义缓存决策器和解析器,这些配置使我们可以精确地控制缓存的内容,时间和方式。