CacheService.put全部忽略键超过某个值

时间:2018-12-27 09:25:13

标签: javascript google-apps-script google-sheets

我有putAll() method的Google缓存脚本脚本有问题。该方法似乎可行,但仅适用于前(〜100)对

在我的脚本中,我必须缓存大量的行(〜2500 * 3),每行使用不同的键,,然后发现缓存服务出现故障。为了确定问题,我写了simple code

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;
}

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

谢谢

1 个答案:

答案 0 :(得分:4)

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

根据您的情况,当i为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

但是还发现,尽管推送了2,000个属性,但仅检索了900个属性。而且我找不到丢失的属性的规律性。从这个结果来看,我认为可能存在最多可以推送的属性。

实验:

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

enter image description here

根据该图,对于上述脚本,发现900个属性是一次可以推送的最大属性数。这不取决于小于100 KB的值的大小。另外,可以获得以下几点。

  • 当将属性从1推到900时,可以正确检索所有属性。
  • 当推送1,000个属性时,将检索1-900个属性。 900之后的属性无法检索。认为这些属性没有被推送。
  • 当推送2,000个属性时,将检索900个属性。但是我找不到它们的规律性。
  • 使用键名“ keyA1,keyA2,keyA3,”推送900个属性后,使用键名“ keyB1,keyB2,keyB3,...”推送100个属性时,可以正确检索1,000个属性。
    • 但是,使用键名“ 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个属性时,可以保存1,000个属性。
    • 认为这是最大数量。
  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()时,请使用容器绑定脚本。
  • 在此报告中,我确认了自己的帐户。我不确定其他用户的所有结果是否相同。对于这种情况,我感到抱歉。

参考:

如果已经报告了上述结果,并且/或者这不是您想要的,