【问题标题】:Choice of storage and caching存储和缓存的选择
【发布时间】:2012-01-09 11:34:26
【问题描述】:

我希望标题选择得足够好,可以问这个问题。

如果没有,请随意编辑,请接受我的道歉。

我目前正在设计一个与网络交互的应用程序。

程序基本流程说明:

用户在我的程序中输入了一个用户 ID,然后用于通过网络访问多个 xml 文件:

http://example.org/user/userid/?xml=1

此文件包含用户在 DRM 系统中拥有的多个产品 ID。然后使用此列表访问有关用户与产品交互的统计信息和信息:

http://example.org/user/appid/stats/?xml=1

这还包含指向特定于该应用程序的各种图像的链接。这些可能随时更改,需要下载才能在应用中显示。

这就是恐怖开始的地方,至少对我来说:D。

1.) 我如何将这些信息存储在用户的 PC 上?

我考虑过使用用户 ID 的目录,然后使用带有 appid 的子文件夹来缓存图像,并使用 xml 文件按需加载它们。我还考虑过在使用相同结构的同时使用 zipfile。

或者更愿意使用像 sqlite 这样的本地数据库?

应用程序的平均数量可能约为 100-300 个左右,每个应用程序的统计数据和图像基本上为 5-700 个。

2.) 我应该什么时候刷新内容?

糟糕的是,下载此数据的网站,或者更确切地说是 xml,在上次刷新/更改时不包含任何时间戳。因此,我需要在用户访问该数据时对所有文件进行哈希处理并进行比较,这可能需要很长时间,因为它是基于网络的。好的,有超时,但我需要阻止对内容的访问,直到下载和处理数据或发生超时。在这两种情况下,应用程序在短时间内甚至可能很长时间都无法访问,我想避免这种情况。我可以让用户在需要时手动刷新,但我希望有一些更好的方法。

尤其是上面提到的应用程序和东西的数量。

感谢您的阅读以及所有这些,如果我忘了解释什么,请随时询问。

【问题讨论】:

    标签: c++ caching storage


    【解决方案1】:
    1. 可能值得使用数据库,因为它可以避免您为结构化数据处理文件格式问题。记得不时删除和重建它(或确保彻底删除旧的东西并不时压缩它,但重新开始可能更容易,因为它只是一个缓存)。

    2. 如果 Web 服务没有提示您何时重新加载,那么您只需要自己决定,但请务必检查 HTTP 标头是否有任何缓存指令以及 XML 数据[* ]。确定数据的合理陈旧度(用户花在查看结果上的时间是绝对最短,因为无论您做什么,他们都会看到陈旧的结果)。每当您下载任何内容时,请记录您下载它的日期/时间。从缓存中刷新旧数据。

    为防止长时间延迟刷新数据,您可以:

    • 直观地表明数据已过时,但无论如何都会显示并在刷新后替换它。
    • 当用户看到很多东西时允许使用过时的数据,而不是当他们只查看少量东西时。因此,您在等待少量内容时“什么都不做”,但在等待大量内容时不会。
    • 运行一个后台任务,该任务除了使缓存中的旧内容过期并重新加载之外什么都不做。主应用始终显示可用的最佳应用,无论它多么旧。

    或者一些策略的组合。

    [*] 想一想,如果 Web 服务器提供了合理的缓存指令,那么在您的应用程序中忘记任何类型的存储或缓存可能是最简单的。只需抓取 XML 文件并显示它们,但通过您已集成到应用程序中的缓存 Web 代理来抓取它们。我不知道是什么代理让这变得简单 - 你可以自己编译 Squid(当然),但我不知道你是否可以将它链接到另一个应用程序而不自己修改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2015-08-18
      • 2015-10-13
      • 2012-06-29
      • 2012-08-18
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多