当前位置: 首页 > 面试题库 >

可以缓存JSON以提高性能/加载时间吗?

常俊爽
2023-03-14
问题内容

我正在使用JSON文件自动填充下拉列表。它绝非庞大(3000行且正在增长),但是刷新页面所花费的时间变得非常明显。

首次加载页面时,将读取JSON,具体取决于用户选择了哪个选项,从而决定了使用JSON的哪一部分来填充下拉列表。

然后将其加载到每次刷新或菜单选择之后。是否可能以某种方式缓存值以防止需要一次又一次地重新加载它?

谢谢。

编辑:更多信息:它本质上是一个单位转换器。JSON包含所有详细信息。例如,当用户选择“临时”时,将进行呼叫并填充列表。转换完成后,您可以整天运行临时转换,它们会很好,但是每当用户更改转换类型时,现在,页面长度就会刷新,并且会花费大量时间。


问题答案:

不幸的是,我不了解PHP中的标准化全局缓存机制。该文章说,被包含在PHP核心的5.5版本开始优化升级,第三方加速器。不知道您使用的是哪个版本,但是您可以尝试使用。

另一方面,您是否考虑过 安德鲁
指出的文件存储?$_SESSION在这种情况下,我认为它可以为您提供真正的帮助。让我给您一个示例,该示例将与您现有的JSON数据一起使用:

服务器端

将JSON数据存储在.jsonPHP服务器上的文件中:

{
    "data": "some data",
    "data2": "more data",
    "data3": [
        ...
     ],
     etc.
}

注意: 请确保正确格式化JSON数据。请记住,所有字符串都必须用 引号引起来"

在PHP中,使用if语句确定适当的操作:

error_reporting(E_ALL);
ini_set("display_errors", "On");
session_start();

if(isset($_SESSION['dataCache'])) {
    echo json_encode($_SESSION['dataCache']);
} else {
    $file = 'data.json';
    if (!is_file($file) || !is_readable($file)) {
        die("File not accessible.");
    }
    $contents = file_get_contents($file);
    $_SESSION['dataCache'] = json_decode($contents, true);
    echo $contents;
}

因此,让我们进一步研究上面的编码。因此,这就是我们正在做的事情:

  1. 打开错误报告并开始会话支持。
  2. 检查我们是否已经读取了该用户的文件。
  3. 如果是这样,请从存储中提取该值,然后将其回显并退出。如果没有,请继续下面。
  4. 保存文件名并进行一些错误检查,以确保PHP可以找到,打开和读取文件的内容。
  5. 读取文件内容。
  6. 将已解码的json(由于传递给json_decode的参数true而不是数组)保存到$ _SESSION变量中。
  7. 将内容回显到屏幕上。

这将节省您解析JSON数据和/或在服务器上手动构建JSON数据的时间和精力。它将为用户缓存,session以便他们可以使用它。

客户端

我假设您是ajax用来获取信息的?如果不是正确的话,但我假设这就是您的某些JavaScript发挥作用的地方。如果是这样,您可以考虑一下:

sessionStorage从服务器返回的数据存储在用户的浏览器中:

$.ajax({
    ...
    success: function (res) {
        localStorage.setItem("dataCache", JSON.stringify(res));
    },
    ...
});

或者,如果您使用承诺对象:

$.ajax({
    ...
}).done(function (res) {
    localStorage.setItem("dataCache", JSON.stringify(res));
});

当您需要阅读它时,可以做一个简单的测试:

var data;
// This returns null if the item is not in local storage.
// Since JavaScript is truthy falsy, it will be evaluated as false.

if(localStorage.getItem("dataCache")) {
    data = JSON.parse(localStorage.getItem("dataCache"));
} else {
    // Make ajax call, fetch object and store in localStorage in the success or done callbacks as described above
}

笔记:

localStorage是HTML5的一项新功能,因此尚不完全支持所有浏览器。但是,大多数主要的工具都可以,甚至可以追溯到IE8(我认为)。但是,对于每个站点需要容纳多少浏览器没有标准的大小限制。

重要的是要考虑到这一点。我可以保证您可能无法将整个30,000行字符串存储在localStorage中。但是,您可以以此为起点。结合服务器端解决方案,您应该会看到性能提高。

希望这可以帮助。



 类似资料:
  • 问题内容: Kotlin是否可以提高性能?有基准测试吗?Kotlin比Java快吗?我在Kotlin网站上找到了这个。https://kotlinlang.org/docs/reference/comparison- to-java.html 谈论语言功能而不是性能。 问题答案: Kotlin生成的字节码与Java非常相似,因此Kotlin代码的性能在大多数情况下与等效Java代码的性能相同。 内

  • 我反复调用以下代码,以从JSON响应中获取某些字符串值。 将其重构如下是否有意义,还是过度杀戮: 是否可以进一步重构,以便val1、val2、val3和val4作为参数传递给同一方法,并返回一个String?

  • 问题内容: 假设我有以下示例: 例子一 现在,可能是: 例子二 关键不是实际的代码,而是使用一次以上,两次/三次或三次以上的时间。 上午我更好的性能,明智使用 例如两个 比 例如一个 (也许与解释为什么或者为什么不)? 编辑/注意 我怀疑两个更好。当我不可避免地忘记将事件处理程序添加到事件处理程序时,我有点担心的是在添加代码,而不是无意中引入了一个潜在的难以诊断的错误。那么我应该使用还是为此? 谢

  • 问题内容: 好的,所以我可以在中使用OrderedDict 。也就是说,OrderedDict可以用作JSON的输入。 但是可以用作输出吗?如果可以,怎么办?就我而言,我想放入OrderedDict,以便可以将键的顺序保留在文件中。 如果没有,是否有某种解决方法? 问题答案: 是的你可以。通过指定JSONDecoder的参数。实际上,这是文档中给出的确切示例。 您可以将此参数传递给(如果不需要其他

  • 问题内容: 可以在中使用。也就是说,可以用作JSON的输入。 但是可以用作输出吗?如果可以,怎么办?就我而言,我想load放入,以便可以将键的顺序保留在文件中。 如果没有,是否有某种解决方法? 问题答案: 是的你可以。通过指定JSONDecoder的参数。实际上,这是文档中给出的确切示例。 你可以将此参数传递给json.loads(如果不需要出于其他目的的Decoder实例),如下所示: 使用以相

  • 问题内容: 引用http://sites.google.com/site/gson/gson-design- document : 为什么Gson中的大多数课程都标记为期末考试? 尽管Gson通过提供可插入的串行器和反序列化器提供了相当可扩展的体系结构,但Gson类并不是专门设计为可扩展的。提供非最终类将允许用户合法地扩展Gson类,然后期望该行为在所有后续修订版中均有效。我们选择通过将类标记为f