CacheService.putAll 忽略超过某个值的键

bra*_*eye 2 javascript google-sheets google-apps-script

我对谷歌缓存脚本的putAll() 方法有问题。该方法似乎有效,但仅适用于前 (~100) 对

在我的脚本中,我必须缓存大量行(~2500 * 3),每一行都在不同的键中,我发现缓存服务出现故障。为了找出问题,我写了一个简单的代码

function myFunction() {
  var cache = CacheService.getScriptCache();
  var toCache = {};
  for (var i = 0; i < 2000; i++){
   toCache["key"+i] = "value"+i;
  }
  cache.putAll(toCache);
  var tmp;
  for (var i = 0; i < 2000; i+=10){
   var a = cache.get("key"+i);
   if (a == null) { tmp = "key"+i; break; }
  }

  tmp = tmp;
}
Run Code Online (Sandbox Code Playgroud)

和过去一样,缓存服务似乎是不可预测的,并且在处理过程中不处理错误。多次调用放置缓存较慢,并且不能确保限制将来不会改变,因为它甚至没有在文档中提到......

谢谢

Tan*_*ike 8

这个答案怎么样?我认为可能有几种方法。因此,请将此视为其中之一。

在您的情况下,wheni是 100,则a返回null。至此,for循环结束。使用如下脚本时,发现CacheService中有100多个属性。

var cache = CacheService.getScriptCache();
var toCache = {};
var keys = [];
for (var i = 0; i < 2000; i++) {
  var key = "key" + i;
  keys.push(key);
  toCache[key] = "value" + i;
}
cache.putAll(toCache);
var r = cache.getAll(keys);

Logger.log(keys.length) // 2000
Logger.log(Object.keys(r).length) // 900
Run Code Online (Sandbox Code Playgroud)

但是也发现虽然推送了2000个属性,但是只检索到了900个属性。而且我找不到丢失财产的规律。从这个结果,我认为可能有最大数量的属性可以推送。

实验:

作为一个实验,我调查了随着推送属性数量的增加,检索到的属性数量。每个属性都被一次性推送。下图是结果。

在此处输入图片说明

从这个图中可以看出,对于上面的脚本,900个属性是一次可以推送的最大属性数。这不取决于小于 100 KB 的值的大小。还可以获得以下几点。

  • 推送 1 到 900 的属性时,可以正确检索所有属性。
  • 当推送 1,000 个属性时,将检索 1-900 个属性。无法检索 900 之后的属性。认为不推送这些属性。
  • 当推送 2,000 个属性时,将检索 900 个属性。但我找不到它们的规律性。
  • 使用“keyA1、keyA2、keyA3、、、”键名推送900个属性后,当使用“keyB1、keyB2、keyB3、、、”键名推送100个属性时,可以正确检索1000个属性。
    • 但是在使用“keyA1, keyA2, keyA3,,,”的键名推送了900个属性后,当使用“keyB1, keyB2, keyB3,,,”的键名推送了101个属性时,只检索到了900个属性。在这种情况下,“keyA”的属性被“keyB”的 101 个属性覆盖。

这些结果与CacheService.getScriptCache()CacheService.getUserCache()和相同CacheService.getDocumentCache()。但是CacheService.getScriptCache(),CacheService.getUserCache()和 的每种方法CacheService.getDocumentCache()都可以用作单独的存储。所以当使用 3 种方法时,可以使用 3,000 个属性。

概括:

  1. 一次可推送的最大属性数为 900。
  2. 推送900个属性后,再添加100个属性,可以保存1000个属性。
    • 认为这是最大数目。
  3. 的方法CacheService.getScriptCache()CacheService.getUserCache()CacheService.getDocumentCache()独立。
    • 使用CacheService.getScriptCache()CacheService.getUserCache()和时,CacheService.getDocumentCache()可以使用 3,000 个属性。

解决方法:

从上面的结果来看,当你推送“~2500 * 3”的属性时,下面的解决方法如何?

  • 将多个值放入一个属性。
  • 使用CacheService.getScriptCache(),CacheService.getUserCache()和 的方法CacheService.getDocumentCache()
    • 这样,可以使用 3,000 个属性。

我认为“~2500 * 3”的属性可以通过这些组合推送到CacheService。

笔记:

  • 使用时CacheService.getDocumentCache(),请使用容器绑定脚本。
  • 在这份报告中,我用我的帐户进行了确认。我不确定其他用户的所有结果是否都相同。对于这种情况,我很抱歉。

参考:

如果上述结果已被报告和/或这不是您想要的,我很抱歉。

  • 很棒的工作,谢谢 (2认同)