Nodejs 100w 条只读 kv 数据想在 node 里查询,有什么最简便的方法吗?
Nodejs 100w 条只读 kv 数据想在 node 里查询,有什么最简便的方法吗?
level 的 kv 数据库非多进程,所以没法用,第二个进程会出错。
sqlite 有点杀鸡用牛刀了,我只是一个查一个 kv。
做成 json 文件加载到内存,简单是简单了,不过多进程 node 用太伤内存了。
有纯 js 的最简单的多进程可以用只读文件 kv 数据库吗?
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 为何要多进程呢
最终还是用 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}`);
注意事项
- 内存使用:100 万条数据可能会占用大量内存,需确保系统有足够的内存。
- 数据加载:如果数据不能一次性加载到内存中,考虑使用流式处理或分批次加载。
- 持久化存储:如果数据需要持久化存储,考虑使用数据库(如 Redis、LevelDB)等,它们提供了高效的键值对存储和查询机制。
对于更复杂或更大规模的数据集,建议使用专门的键值存储数据库,这些数据库通常提供了更高效的查询和存储机制,以及更好的数据持久化能力。


