使用localstorage存储大量对象的最佳实践

Best practise of using localstorage to store a large amount of objects

目前我正在尝试使用 localStorage 来存储大量相同类型的对象,但我有点困惑。

一种思路是将所有对象存储在一个数组中。但是对于单个对象的每个 read/write 我需要 deserialise/serialise 整个数组。

另一种方法是直接将每个对象及其键存储在本地存储中。这将使访问每个对象更容易,但我担心将存储的对象数量(数万个)。此外,获取所有对象将需要迭代整个 localStorage!

我想知道哪种方式在您的体验中会更好?另外,是否值得尝试更复杂的客户端数据库,如 PouchDB?

我没有亲自使用localStorage 来管理这么多元素。

但是,我通常使用的数据管理模式是将完整的信息数据库加载到一个javascript对象中,过程中在内存中进行管理,过程结束时再次保存到localStorage。

当然,根据您的项目规范,此模式可能不是满足您需求的好方法。

如果您需要不断保存数据,数据访问可能会成为一个问题,因此使用某种类型的小型数据库访问可能是更好的选择。

如果您的数据量特别大,在内存中管理它也可能是个问题,但是,根据数据模型,您可以将其构建为允许加载和保存的高效结构只在需要时提供数据。

如果您想要一些简单的东西来存储大量 key/values,并且您不想担心类型,那么我建议 LocalForage. You can store strings, numbers, arrays, objects, Blobs, whatever you want. It uses IndexedDB and WebSQL where available, so the storage limits 比 LocalStorage 高得多。

PouchDB 也可以,但 API 更复杂,更适合在服务器上与 CouchDB 同步数据的情况。

如果你不想拥有很多钥匙,你可以:

  • \n 连接行 JSON 并将它们存储为单个键
  • 构建和更新存储在单独键下的索引,每个索引将一些键与特定行号链接起来。

在这种情况下,解析行只是 .split('\n'),比 JSON.parse.

快 ~2 个数量级

请注意,您可能需要特别努力才能同步同时打开的标签页。在复杂的情况下,这可能是一个挑战。

localStorage 有好有坏。

好的部分:

  • 同步;
  • 极快,读写都只是 memcpy – 即使在弱设备上也有 100+Mb/s 的吞吐量(例如 JSON.stringify 通常是 [=31= 的 5-20 倍]比 localStorage.setItem);
  • 经过全面测试且可靠。

坏消息:

  • 没有事务,因此您需要工程来同步选项卡;
  • 认为您没有超过 2Mb(因为存在具有此限制的系统);
  • 2Mb 的存储实际上意味着您可以保存 1M 个字符。

这些点显示了 localStorage 作为数据库的适用范围。 LS 适用于任务,需要同步性和速度,并且可以 trim 数据库以适应配额。

所以 localStorage 适用于缓存和日志。不多了。