存储和缓存的选择
Choice of storage and caching
我希望标题选得足够好,可以问这个问题。
如果没有,请随意编辑,并接受我的道歉
我目前正在布局一个与网络交互的应用程序。
程序基本流程说明:
用户在我的程序中输入一个UserID,然后该程序用于通过web访问多个xml文件:
http://example.org/user/userid/?xml=1
该文件包含用户在DRM系统中拥有的产品的几个ID。该列表用于访问有关用户与产品交互的统计数据和信息:
http://example.org/user/appid/stats/?xml=1
它还包含指向特定于该应用程序的各种图像的链接。这些可能随时发生变化,需要下载才能在应用程序中显示。
这就是恐怖的开始,至少对我来说是这样。
1.)如何将该信息存储在用户的PC上
我考虑过为userid使用一个目录,然后使用带有appid的子文件夹来缓存图像,并根据需要加载xml文件。我还考虑过在使用相同结构的同时使用zip文件。
还是应该使用像sqlite这样的本地数据库?
应用程序的平均数量可能在100-300之间,每个应用程序的统计数据和图像基本上在5-700之间。
2.)我应该什么时候刷新内容
糟糕的是,下载这些数据的网站,或者更确切地说是xml,在上次刷新/更改时不包含任何时间戳。因此,我需要对所有文件进行哈希处理,并在用户访问数据的那一刻对它们进行比较,这可能需要非常长的时间,因为它是基于网络的。好吧,有超时,但我需要阻止对内容的访问,直到数据被下载和处理,或者超时发生。在这两种情况下,应用程序在很短甚至很长一段时间内都无法访问,我希望避免这种情况。我可以让用户在需要时手动刷新,但我希望有更好的方法。
尤其是上面提到的应用程序和东西的数量。
谢谢你的阅读和所有这些,如果我忘记解释什么,请随时询问。
-
使用DB可能是值得的,因为它可以省去结构化数据的文件格式。记住不时地删除和重建它(或者确保旧的东西被彻底删除并不时地压缩,但重新开始可能更容易,因为它只是一个缓存)。
-
如果web服务没有为您提供何时重新加载的线索,那么您只需要自己决定,但一定要检查HTTP标头中是否有任何缓存指令以及XML数据[*]。确定数据的合理过时程度(用户盯着结果看的时间是绝对最小值,因为无论你做什么,他们都会看到过时的结果)。无论何时下载任何内容,都要记录下载日期/时间。从缓存中清除旧数据。
为了防止刷新数据的长时间延迟,您可以:
- 直观地指示数据已过时,但无论如何都要显示它,并在刷新后替换它
- 当用户有很多可见的东西时,允许跟踪数据,而不是当他们只看少量的东西时。所以,在等待少量的东西时,你会"什么都不做",但在等待大量的东西时却不会
- 运行一个后台任务,它只会将缓存中的旧内容过期并重新加载。无论多么旧,主应用程序都会显示最佳可用内容
或者一些战术组合。
[*]仔细想想,如果网络服务器提供了合理的缓存指令,那么忘记应用程序中的任何存储或缓存可能都是最简单的。只需获取XML文件并显示它们,但要通过集成到应用程序中的缓存web代理来获取它们。我不知道是什么代理让这变得容易——你可以自己编译Squid(当然),但我不知道你是否可以在不修改的情况下将其链接到另一个应用程序中。
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 点燃缓存加载时间的选择查询
- 如何在动态编程中选择缓存的初始值?
- 存储和缓存的选择