代码之家  ›  专栏  ›  技术社区  ›  Tyler Carter

基于会话的缓存解决方案可行吗?

  •  0
  • Tyler Carter  · 技术社区  · 15 年前

    我想知道在会话变量中存储缓存项是否可行,而不是创建基于文件的缓存解决方案?因为它是每个用户一次,所以如果用户访问多个页面,它可以减少对数据库的一些额外调用。但这值得付出努力吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Pascal MARTIN    15 年前

    如果正在缓存的数据 (愿意缓存) 不依赖用户,为什么要存储在会话中…哪个附加到用户?

    考虑到会话通常存储在文件中,与自己使用文件相比,它不会优化任何内容。

    如果站点上有10个用户,那么缓存中的数据是相同的10倍?我认为这不是缓存东西的最佳方法;-)

    对于所有用户都相同的数据,我真的会使用另一种解决方案,不管它是基于文件还是不基于文件(即使对于特定于一个用户或一组用户的数据,我也可能不会将其存储在会话中——除非非常小,可能如此)

    您可以查看以下内容:

    • 几乎每个框架都提供了某种缓存机制。例如:
    • 您可以使用大量后端存储缓存数据;例如:
      • 文件夹
      • 共享内存(使用类似 APC 例如)
      • 如果您有多个服务器和数据负载, memcached
      • (有些框架提供了与这些类一起工作的类;从一个框架切换到另一个框架甚至可以像更改配置文件中的几行一样简单^)

    下一个问题是:您需要缓存什么?多长时间?但这是另一个问题,只有你能回答;-)

        2
  •  1
  •   Thorarin    15 年前

    可以,但这在很大程度上取决于您试图缓存的内容,以及其他一些情况。

    • 信息可能会改变吗?
    • 如果显示稍微过时的信息会有问题吗?
    • 查询对数据库施加的负载有多大?
    • 数据库服务器的延迟是什么?(在本地网络上不应该是问题)
    • 应该为每个用户缓存信息,还是为整个应用程序全局缓存信息?
    • 涉及的数据量
    • 等。

    在某些情况下,性能提升可能非常重要。在我工作过的一个特定的ASP.NET/SQL Server站点上,添加一个简单的缓存机制(在应用程序级别)将Web服务器上的CPU负载减少了一个系数3(!)同时,在访问某个表时,防止了大量的数据库超时问题。

    我已经有一段时间没有在PHP中做过任何严肃的事情了,但我认为您唯一的选择是在会话级别上做这件事。然而,我上述的大多数考虑仍然有效。至于努力,假设您的代码结构足够,那么实现它应该花费很少的精力。

        3
  •  -1
  •   Janie    15 年前

    会话只应严格用于特定于用户的数据。如果您使用它来缓存应该在多个会话中通用的内容,那么您就不必要地复制了大量数据。为什么不使用ASP.NET附带的缓存(如果您的问题是DB往返,则可以使用进程内缓存,而不是SQL,因为您将在内存中存储缓存的数据)