2012-05-02 23 views
5

Tôi có nhu cầu lưu trữ một số siêu dữ liệu trong ứng dụng node.js mà tôi đang viết. Thay vì đưa ra định dạng tệp của riêng tôi và quản lý tệp đó, tôi muốn sử dụng kho lưu trữ khóa-giá trị tồn tại trong quá trình.Lưu trữ khóa-giá trị tồn tại trong quá trình cho node.js

Tôi đã xem mongodb nhưng có vẻ như mongodb phải luôn chạy quá trình (nghĩa là bạn cần khởi động máy chủ mongo trước, sau đó kết nối với nó trong node.js.) Tôi yêu cầu bất cứ điều gì lưu trữ điều này, nó tồn tại hoàn toàn trong quá trình node.js - hoặc ít nhất là bất kỳ quy trình bên ngoài nào được quản lý hoàn toàn một cách minh bạch bởi thư viện và giết chúng khi ứng dụng đóng kết nối.

Tôi không quan tâm nhiều về hiệu suất, nhưng nó sẽ là tốt đẹp để hỗ trợ IO không đồng bộ đến cửa hàng để theo kịp với toàn bộ điều không đồng bộ của Node.

Sẽ rất tuyệt nếu cửa hàng hỗ trợ chỉ mục, vì tôi chắc chắn sẽ truy vấn dữ liệu theo cách mà chỉ mục sẽ hữu ích.

Tôi khá chắc chắn rằng 'sqlite' sẽ hoạt động đối với tôi, ngoại trừ việc tôi không thực sự thấy nó gần như thuận tiện như một kho khóa giá trị. Lý tưởng nhất là tôi có thể nói bằng JSON chứ không phải SQL. Nhưng sqlite sẽ hoạt động nếu không có gì tốt hơn.

Cảm ơn!

+0

Xin vui lòng bạn có thể giải thích _why_ bạn đều phụ thuộc mình để hạn chế điều này? –

+0

Sử dụng đối tượng Javascript. Nếu bạn chỉ có một tiến trình, thì sự không đồng bộ là moot. –

+0

làm yoy thực sự cần một cơ sở dữ liệu cho sự bền bỉ "một số siêu dữ liệu"? Tôi không nghĩ vậy. –

Trả lời

2

Bạn có thể quan tâm trong việc sử dụng redis http://redis.io/

Có một thư viện helper phổ biến cho nút https://github.com/mranney/node_redis

Sau đó, bạn có thể làm điều này:

var redis = require("redis"); 
var client = redis.createClient(); 

client.set("foo_rand000000000000", "OK"); 
+5

Cảm ơn, nhưng tiếc là điều này không có vẻ là trong quá trình - nó đòi hỏi một quá trình máy chủ chạy bên ngoài. – eblume

+1

Cuối cùng, tôi đã đi với điều này. Để làm cho nó có vẻ giống như một quá trình duy nhất cho người dùng cuối, tôi quay một máy chủ redis cục bộ trên một cổng không có đặc quyền từ bên trong nút bằng cách sử dụng 'child_process.spawn' và chắc chắn xé nó xuống trước khi thoát. Cảm ơn bạn đã đề xuất! – eblume

+0

Đó là một cách tiếp cận khá mới lạ. Tôi vui vì bạn đã làm nó hoạt động. Hy vọng rằng đóng gói redis cài đặt như là một phần của ứng dụng của bạn không phải là quá phiền hà. – 250R

-1

Làm thế nào về ...

var store = { }; 

//store 'myKey' 
store.myKey = { foo: 'bar' }; 

//fetch 'myKey' 
var x = store.myKey; 

Ngoài ra, Googling với gần như chính xác tiêu đề câu hỏi của bạn, bạn sẽ nhận thấy http://pgte.github.com/alfred/

tôi không thực sự nghĩ rằng có rất nhiều người particularily ổn định sẵn nào được nêu . Các dịch vụ bên ngoài là khá tốt mặc dù (ví dụ Redis.)

+0

Cảm ơn bạn đã đề xuất! Alfred là một khả năng thực sự, nhưng bạn nói đúng, nó không tấn công tôi như là cực kỳ ổn định - nhưng chắc chắn có giá trị một shot. Một cửa hàng đối tượng đơn giản như bạn đề xuất có thể hoạt động, nhưng tôi nghi ngờ nó sẽ bị sặc khi tôi chạy 'truy vấn' như "nhận tất cả các đối tượng có thuộc tính X lớn hơn giá trị như vậy", với điều kiện tôi sẽ có vài trăm nghìn mục nhập. – eblume

+0

@eblume vâng nó khá có thể .. Bạn sẽ cần phải đưa ra một số chương trình lập chỉ mục cho nó. Tôi thực sự chỉ cần đi với mongo hoặc redis nếu có thể, cả hai đều khá đơn giản để thiết lập. –

+0

Tôi đồng ý rằng nó có vẻ đơn giản để giao tiếp với một trường hợp redis hiện có hoặc để bắt đầu một trường hợp redis địa phương vĩnh viễn ... nhưng tôi tự hỏi làm thế nào khó khăn/hợp lý nó sẽ là bắt đầu một ví dụ redis từ bên trong một ứng dụng nút, sử dụng nó một ít, sau đó tắt nó khi bạn đã làm xong? Tôi giả sử sử dụng mô-đun 'child_process' có thể hoạt động. – eblume

3

Hãy xem https://github.com/sergeyksv/tingodb. Nó tương thích chặt chẽ với MongoDB API để bạn có thể nâng cấp lên MongoDB khi bạn cần nó.

+0

Xin cảm ơn, lời khuyên tốt. Hữu ích trong trường hợp bạn muốn nhóm một DB trong thư viện nút của bạn, nhưng cũng muốn hỗ trợ các giải pháp có khả năng mở rộng tốt hơn –

1

Tôi nghĩ bạn có thể quan tâm đến final-db.

FinalDB sử dụng hệ thống tệp để lưu trữ dữ liệu của nó. Đây không phải là kho khóa-giá trị nhưng là giải pháp nosql dựa trên tài liệu. Nó hỗ trợ các chỉ mục (bản đồ) - bạn có thể chỉ định chức năng bản đồ trên mỗi bộ sưu tập và tất nhiên đó là một trong quá trình giải pháp.

0

Hãy xem levelup. Đây là một wrapper quanh leveldb. Trình bao bọc cấp độ cài đặt leveldb qua npm và chạy hoàn toàn trong quá trình nút của bạn.

Có nhiều cơ sở dữ liệu được xây dựng trên đỉnh leveldb. Hãy xem https://github.com/rvagg/node-levelup/wiki/Modules để biết danh sách.

Để thuận tiện, bạn có thể sử dụng gói level mà bó cả levelup và leveldown cùng

Các vấn đề liên quan