【问题标题】:Asp.Net core distributed cachingAsp.Net core 分布式缓存
【发布时间】:2020-03-24 00:49:14
【问题描述】:

我目前正在使用MemoryCache _cache = new MemoryCache(new MemoryCacheOptions()); 缓存数据库中的一些数据,这些数据不会经常更改,但确实会更改。 在创建/更新/删除该数据时,我会刷新缓存。

这很好用,但问题是在生产中我们的节点很少,所以当调用创建记录的方法时,缓存将只在该节点上刷新,而不是在其他节点上,并且它们将有过时的数据。

我的问题是,我可以使用 MemoryCache 以某种方式解决此问题,或者我需要做其他事情,如果我这样做了,可能的解决方案是什么?

【问题讨论】:

  • 您可以查找DistributedCachingRedis等系统提供的解决方案

标签: c# asp.net .net asp.net-core caching


【解决方案1】:

我想你要找的是Distributed Caching

使用 IDistributedCache 接口,您可以使用 Redis 或 Sql Server,它提供基本的 Get/Set/Remove 方法。在一个节点上所做的更改将可用于其他节点。

使用 Redis 是在负载平衡环境中的服务器之间共享 Session 类型数据的好方法,鉴于您似乎正在缓存以避免 db 调用,Sql Server 似乎不太适合。

如果您实际上首先通过缓存使事情复杂化,这也可能值得考虑。当您拥有单个应用程序时,您会看到好处,因为将它们保存在应用程序内存中可以通过网络保存请求,但是当您有负载平衡方案时,您必须比较从分布式缓存中检索这些记录与从数据库中检索它们.

如果数据只是相对较小的数据库表的内存副本,那么在两者之间可能没有太多的性能选择。如果数据是基于复杂昂贵的查询,那么缓存就是最佳选择。

如果您每分钟对数据发出数百个请求,那么任何网络请求都可能过多,但您可以考虑数据有点陈旧的后果是什么?例如,如果您更新了一条记录,而新记录并非在每台服务器上都立即可用,那么您的应用程序会中断吗?还是只是以更阶段性的方式发生变化?在这种情况下,您可以保留进程中的内存缓存,只需使用更短的生存时间。

如果您确实需要将每个更改立即传播到每个节点,那么您可以考虑将Cache Manager 之类的库与 Redis 结合使用,它可以将内存缓存和与远程缓存同步。

【讨论】:

    【解决方案2】:

    有点过时的问题,但也许仍然有用:我同意 ste-fu 所说的,很好解释。

    我只补充一点,在 CacheManager 之上,您可能想看看我最近发布的 FusionCache ⚡?

    除了支持为您透明管理的可选distributed 2nd layer之外,它还具有一些其他不错的功能,例如optimization,可防止执行同一缓存键的多个并发工厂(减少源数据库的负载) ,fail-safe 机制和 advanced timeouts 具有后台工厂完成

    如果你愿意给它一个机会,请告诉我你的想法。

    /无耻之塞

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 2021-07-01
      • 2014-10-26
      • 2017-07-01
      • 2021-07-19
      • 2017-09-28
      • 2012-03-15
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多