Nodejs 100w 条只读 kv 数据想在 node 里查询,有什么最简便的方法吗?

Nodejs 100w 条只读 kv 数据想在 node 里查询,有什么最简便的方法吗?
level 的 kv 数据库非多进程,所以没法用,第二个进程会出错。
sqlite 有点杀鸡用牛刀了,我只是一个查一个 kv。
做成 json 文件加载到内存,简单是简单了,不过多进程 node 用太伤内存了。

有纯 js 的最简单的多进程可以用只读文件 kv 数据库吗?

14 回复

leveldb 用单进程 node 封装成一个服务,然后你多进程的 node 去调用不就好了。


这样不仅仅支持多进程的 node 可能在一台机器上调用,就算你是多机器。也可以调用到这个 leveldb 的服务。后续如果做到要搞多机 leveldb 服务,到时候做个同步简单一点。

几年前我还做过一个 leveldb 的服务,可以给你参考下,理论上可以支持多语言和多机同步。不过毕竟是几年前写的,可能也比较青涩,线上最好别使用,但参考实现应该没问题。https://github.com/zy445566/vertical

redis 不行吗

redis 还不如直接 json 读到内存简单呢,一个性质

我是想找个简单的办法呢,不需要太多功能,只是当个只读字典用,实在不行 sqlite 也比搞成分布的简单

redis 不需要你去解决多进程问题啊。

嗯对。我忘说了一点,我也不想全加载到内存,即使只在 redis 加载一份,因为小鸡只有 1G 内存不想白浪费 200M 内存。

当然还有个办法是直接存成无数小文件,简单,但似乎太浪费 inode 了,小鸡整个盘总共才 100 多 w inode

机器配置只有 1G 为何要多进程呢

有二个核不用白不用,毕竟 Node 是单线程的

最终还是用 sqlite 了,也不太麻烦

redis 不行吗

在 Node.js 中处理 100 万条只读 key-value (KV) 数据,有几种简便的方法可以考虑,主要取决于数据的存储和访问模式。以下是一个使用内存存储(如 JavaScript 对象或 Map)的示例,这种方法适用于数据可以完全加载到内存中的情况。

使用 Map 存储和查询

const data = new Map();

// 假设数据已经以某种方式加载到 data Map 中
// 例如,从一个文件中读取并填充到 Map 中
for (let i = 0; i < 1000000; i++) {
  data.set(`key${i}`, `value${i}`);
}

// 查询数据
function getValue(key) {
  return data.get(key);
}

// 示例查询
const keyToFind = 'key500000';
const value = getValue(keyToFind);
console.log(`The value for ${keyToFind} is ${value}`);

注意事项

  1. 内存使用:100 万条数据可能会占用大量内存,需确保系统有足够的内存。
  2. 数据加载:如果数据不能一次性加载到内存中,考虑使用流式处理或分批次加载。
  3. 持久化存储:如果数据需要持久化存储,考虑使用数据库(如 Redis、LevelDB)等,它们提供了高效的键值对存储和查询机制。

对于更复杂或更大规模的数据集,建议使用专门的键值存储数据库,这些数据库通常提供了更高效的查询和存储机制,以及更好的数据持久化能力。

回到顶部