关于在Android上缓存数据的思考

关于在Android上缓存数据的思考,android,json,api,caching,Android,Json,Api,Caching,所以我一直在想缓存数据的好方法。不仅仅是图像,因为如果数据不变,就不必再次获取该数据。我一直在想的是: 假设我已经用php编写了一个API,它提供JSON作为对通过Android和其他移动平台上的应用程序发出的请求的响应 我有一个结构,用户可以看到某些公司的相册。结构如下: 公司 唱片(公司有许多唱片) 照片(相册有许多照片) 我的API的一个功能是,它可以显示数据库中所有公司的列表。这个名单可能相当大。我缓存此数据的方法如下: 生成一个API_CACHE_密钥,当一家公司被编

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

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

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

  • 公司
    • 唱片(公司有许多唱片)
      • 照片(相册有许多照片)
我的API的一个功能是,它可以显示数据库中所有公司的列表。这个名单可能相当大。我缓存此数据的方法如下:

  • 生成一个API_CACHE_密钥,当一家公司被编辑或删除时,我可以将SharedReferences中的API_CACHE_密钥与Web服务器中的API_CACHE_密钥进行比较。如果不同,我将只获取已更改的公司,因为我还可以在API中获取单个公司。此API_缓存_密钥将基于散列的时间戳

  • 如果API_CACHE_密钥与上次相同,我可以从缓存中取出数据

这是缓存各种数据的好技术吗?还是这样做太过分了?我知道获取API_CACHE_密钥需要一个请求,但与每次获取整个列表相比,数据量会更少


什么是良好做法?你们还有其他聪明的技术来处理这种缓存吗?

我会首先决定你们试图通过缓存来解决的具体问题。有两件事我能想到,你正试图避免:

  • 对您的服务进行HTTP调用
  • 在完成一个调用之后,在服务器端执行工作(在PHP中)
  • 自动到期

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

    只需做一个昂贵的公司API调用,然后在本地存储大约6个小时。相信我,如果你能让这种方法起作用,它的简单性是值得的

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

    有效到期日

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

    例如,从Android设备向公司API调用发送一个哈希列表,它只会根据哈希返回更新的实体


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

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

    • 发送带有数据的上次修改的标题,指示此数据上次更改的时间。保存此消息,并在收到响应时保存它。然后,当您想要再次请求相同的数据时,您可以发送If-Modified-Since头,其中包含您的时间戳是从何时开始的。如果未更改,服务器将发送304 not modified,您将使用缓存的数据-否则,您将获得一个新的数据集和上次修改的标头

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


    这两个都是标准的,都会有很好的文档记录和理解,因此我建议您研究它们,以帮助您找到最适合您的应用程序的方法

    从性能角度来看,应用程序存储时间戳并发送时间戳不是更好吗?通过这种方式,API的服务器可以确定要发送的数据,并且您可以在单个请求中解析更新。啊,这将是在需要数据的地方刷新数据的好方法。