在客户端缓存大量 json 结果
Cache large volume of json result on client side
我有一个 asp.net 的mvc应用程序,它返回的JSON结果包含长达n年的数据,然后在Javascript图表上呈现。
为了获得良好的用户体验(在性能方面(,我正在寻找最佳解决方案,是否可以在客户端缓存 JSON 数据,以便当用户单击具有不同参数(如日、周视图等(的图表时,查询相同的 JSON 数据而不会命中服务器。
有人可以帮助我们在缓存最佳实践方面做出最佳决策,即数据是否应该缓存在客户端或服务器端,或者应该直接命中每个图形切换的数据库?
提前谢谢。
首先,数据库在哪里?如果您在具有千兆LAN的本地网络上,那么击中它不会有问题。但是,在互联网上并非如此。人们的带宽有限,尤其是在移动设备上,因此您应该限制您的HTTP调用。此外,更少的 HTTP 调用意味着对服务器的压力更小。
以下是一些提示:
-
考虑分页
加载"2年价值"时,我想了很多,就像一篇100+页的论文。请考虑对数据进行分页,而不是一次加载所有数据。这样可以节省带宽和缓存空间(如果有限的话(。
如何:让服务器脚本根据客户端需要的内容对数据进行切片。在查询中使用
LIMIT
在 SQL 中创建分页非常容易。逻辑就像starting_item = (page_needed - 1) * items_per_page
-
JSONify 数据
使用 JSON 将数据传输到网络或从网络传输数据。除了轻巧之外,它还具有结构。以后会更容易解析和存储。
如何:PHP 有一个json_encode函数,可以将数组转换为 JSON 字符串。我假设你的框架有类似的功能。在页面上回显字符串,然后使用
JSON.parse
从 JSON 字符串转换为 JS 对象。JSON方法在现代浏览器中是原生的,但如果您需要迎合旧浏览器,Crockford有一个库来解析它 -
使用众所周知的存储框架
如果需要持久存储来跨页面缓存,我最近遇到了 PersistJS,它将本地存储抽象为浏览器上可用的存储。另外,这里是 LZW 的 JS 实现。请随身携带,因为本地存储使用字符串来存储数据,并且有 5-10MB 的限制。
如何:使用
JSON.stringify
将数据转换为字符串,并使用 PersistJS 存储数据。然后为了检索,获取字符串并使用JSON.parse()
将其解析回来 -
仅在需要时呼叫
让缓存系统仅在修改、添加或不存在某些内容时才调用服务器。如果数据在那里,为什么要为它调用服务器?
-
同步缓存
如果您担心数据过时,请使用一些实时数据获取方法,让一些 AJAX 同步您的缓存系统,如本 wiki 中关于 Comet 中所述。
最后两点取决于您的缓存框架。但是BackboneJS允许它的模型和集合同步到服务器,它们具有我提到的相同功能。
我已经完成了你想做的事情,这是我的经验。我在工作中使用Oracle的Site Studio中间件。我寻找了一个可以与之配合使用的框架,但找不到。所以我在下面尝试了两个选项。
1(数据库查询返回一定数量的行。我尝试了 2,000 作为测试。一个简单的 foreach 循环将返回的数据转换为 JSON 数据。因此,它在循环行时实际上会构建一长串 JSON 变量。通过这种方式,您正在模仿本地 dababase 的快照。JS实际上可以非常快速地访问数组元素,并且可能会让您惊讶于排序,更改,删除信息的速度。
<script>
var appData = [{'id':'0','first':'Sam','last':'Smith'},{'id':'1','first':'Dan','last':'Smith'}];
</script>
此 JSON 数据包含在脚本标记中。然后,doc.ready 上的 JQuery 读取数据并根据需要将其添加到 html 文本中。当用户更改 JSON 数据值时,ajax 将触发并将更改保存到数据库。将这样的系统添加到您的应用程序中并不难。后来我使用Google的Angular.js将数据绑定到UI以获得干净的MV模式,并且也很容易进行快速的客户端排序和过滤。如前所述.js Backbone和其他JS框架可以将客户端数据同步到服务器。
2(我将数据保存到html页面的第二种方法是再次使用foreach循环返回的行。然后我使用老式将数据保存在 HTML 中
<input type="hidden" name="someName" value="someValue" />
然后,我使用 JQuery 来处理数据并将其添加到 UI 中。如果你真的想疯狂使用JSON,你实际上可以像这样嵌入HTML变量中。
<input type="hidden name="row1" value="{'color':'red','style':'fancy','age':'44'}" />
然后,您可以使用 JQuery 或 Angular .js来处理数据并将其绑定到您的 UI。
有趣的是,许多应用程序框架没有内置的客户端缓存系统。在服务器端对选择菜单进行排序然后重建 html 确实效率低下。最好在JS中对其进行排序并动态重建选择菜单。这里有一个安全问题,你不希望将私人信息打印到 JSON 或 HTML 变量中,因为它在视图源代码下可见。此外,您还可以使用更多流氓技术在页面中嵌入数据。请考虑以下事项:
<span class="data" value="1234"></span>
$(function () {
$('.data').each( function() {
var val = $(this).attr('value');
console.log(val); //process data
});
});
然后,您可以在doc.ready上使用JQuery来处理名为数据的类。您还可以将 JSON 数据填充到值中,并在以后解析出来。请记住,JQuery 的人反对开发人员以这种方式使用类。根据我的经验,如果你不过度使用它,它的效果很好。
- 从数据库中检索数据并在服务器上另存为静态文件。提供.css或.png扩展。(浏览器将自动缓存样式表和图像文件。
- 在隐藏字段中保存带有时间戳的数据文件名。(确保在文件发生更改时从服务器加载最新文件(
- 使用 AJAX 从服务器加载文件,第一次将从服务器加载,但下次将从浏览器缓存加载。
- 您可以使用 JSON。Parse(( 来解析 AJAX 请求结果。
- 对于每个json结果,使用类jquery添加css
- 在Ionic'中显示JSON结果;s系列重复
- 如何将JSON结果设置为'src'共'img'以在ASP.NET MVC4中显示图像
- 获取json结果的身份验证问题
- 无法在AJAX成功访问中显示JSON结果
- jQuery 循环 JSON 结果,对象作为值
- json结果显示第一个值
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- 我无法通过AJAX获得嵌套的JSON结果
- 我如何用jquery读取简单的json结果,以及如何发布新的结果
- onclick在视图中显示重复的json结果
- 如何在Javascript中解析Json结果
- 如何使用javascript将json结果转换为数组
- 调用.ajax方法得到未定义的json结果,返回json格式列表<字符串>
- 如何将自定义字段添加到Json结果-ASP.NET MVC
- 如何提醒我的 json 结果
- 无法在iPhone应用程序上使用PhoneGap和javascript获取JSON结果,但使用相同的代码在Android
- 以 json 结果的形式返回对象列表
- 如何使用 JQuery 以表格形式打印通用 json 结果
- jquery-ui 自动完成仅允许从多个 JSON 结果中按名称搜索