0

所以我一直在想缓存数据的好方法。不仅是图像,因为如果数据没有改变,就没有必要再次获取该数据。我一直在想的事情是:

假设我在 php 中编写了一个 API,它提供 JSON 作为对通过我在 Android 和其他移动平台上的应用程序发出的请求的响应。

我有一个结构,用户可以看到某些公司的相册。结构如下:

  • 公司
    • 专辑(公司有很多专辑)
      • 照片(相册有很多照片)

我的 API 的功能之一是,它可以显示我们数据库中所有公司的列表。该列表可能非常大。我缓存这些数据的方法是这样的:

  • 生成一个 API_CACHE_KEY,当公司被编辑或删除时,我可以将我的 sharedprefences 中的 API_CACHE_KEY 与网络服务器中的 API_CACHE_KEY 进行比较。如果不同,我只会获取已更改的公司,因为我还可以在我的 API 中获取个别公司。此 API_CACHE_KEY 将基于经过哈希处理的时间戳。

  • 如果 API_CACHE_KEY 和上次一样,我可以从缓存中取出数据。

这是缓存各种数据的好方法吗?或者这样做是否有点矫枉过正?我知道获取 API_CACHE_KEY 需要一个请求,但它会比我每次获取整个列表的数据少。

什么被认为是好的做法?你们还有其他智能技术来处理这种缓存吗?

4

2 回答 2

0

我建议使用网络上其他地方已经使用的缓存机制之一,例如您可能为网站处理 css 文件缓存的方式。两种选择:

  • 发送带有您的数据的 Last-Modified 标头,指示此数据上次更改的时间。当你得到它时保存这个和响应。然后,当您想再次请求相同的数据时,您可以发送 If-Modified-Since 标头以及时间戳的来源。如果它没有改变,你的服务器发送 304 not modified 并且你使用缓存的数据 - 否则,你会得到一个新的数据集和 Last-Modified 头。

  • 使用 ETag,这基本上是一样的。为每个数据集生成一个唯一的散列,然后如果数据发生变化,它会发生变化。

这两个都是标准的,并且会被很好地记录和理解,所以我建议您研究它们以帮助您找出最适合您的应用程序的方法

于 2013-06-18T20:21:31.957 回答
0

我会首先决定你试图通过缓存解决什么具体问题。我能想到的有两件不同的事情是你试图避免的:

  1. 对您的服务进行 HTTP 调用。
  2. 拨打电话后,在服务器端(在 PHP 中)进行工作。

自过期

您可以通过在 Android 设备上本地缓存数据并让它自行过期来避免 (1) 。

只需进行昂贵的公司 API 调用,然后在本地存储大约 6 小时。相信我,如果你能让这种方法奏效,那么它的简单性是值得的。

对于 (2),也可以在服务器端进行缓存。您可以使用相同的方法。只需缓存一个函数调用并让它在一段时间内过期。

有效到期

对于 (1),正如您已经指出的,您无法避免进行 HTTP 调用以查看发生了什么变化。您必须至少打一个电话,看看可能发生了什么变化。你散列实体的想法会很好。

例如,将一个哈希列表从 Android 设备发送到公司 API 调用,它只发回基于哈希的更新实体。

对于 (2),主动使缓存中的对象无效可能会很痛苦。如果您想主动失效/替换它,我只会在缓存中保留一个数据实例。否则很难追踪所有实例并更新/替换数据。

于 2013-06-18T19:27:04.507 回答