关于在Android上缓存数据的想法

时间:2013-06-15 15:31:39

标签: android json api caching

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

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

我有一个用户可以查看某些公司专辑的结构。结构如下:

  • 公司
    • 专辑(公司HasMany专辑)
      • 照片(相册HasMany照片)

我的API的一个功能是,它可以显示我们数据库中所有公司的列表。那份清单可能很大。我缓存这些数据的方法是:

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

  • 如果API_CACHE_KEY与上次相同,我可以从缓存中获取数据。

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

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

2 个答案:

答案 0 :(得分:0)

我首先要确定您尝试通过缓存解决的具体问题。我想到的有两件不同的事情是你要避免的:

  1. 对您的服务进行HTTP调用。
  2. 打完电话后,在服务器端(用PHP)工作。
  3. 自我过期

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

    只需进行昂贵的公司API调用,然后在本地存储6个小时。相信我,如果你能使这种方法有效,那么为了简单起见,这是值得的。

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

    有效期限

    对于(1),正如您已经指出的那样,您无法避免进行HTTP调用以查看已更改的内容。您必须至少拨打一次电话才能看到可能发生的变化。您对哈希实体的想法可以正常工作。

    例如,将Android设备中的哈希列表发送到公司API调用,然后根据哈希值发回仅更新的实体。

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

答案 1 :(得分:0)

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

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

  • 使用ETag,这基本上是一回事。生成一个唯一的哈希以与每个数据集一起使用,如果数据发生变化,它将发生变化。

这些都是标准的,并且会有详细记录和理解,因此我建议您研究它们以帮助您找出最适合您应用的方法