Want to take your software engineering career to the next level? Join the mailing list for career tips & advice Click here


Distributed Transactional In-Memory Database (全球首个支持分布式事务的MongoDB)

Subscribe to updates I use memdb

Statistics on memdb

Number of watchers on Github 592
Number of open issues 10
Main language JavaScript
Average time to merge a PR 4 days
Open pull requests 1+
Closed pull requests 0+
Last commit over 2 years ago
Repo Created over 5 years ago
Repo Last Updated 4 months ago
Size 1.19 MB
Homepage http://memdb.org
Organization / Authorrain1017
Latest Releasev0.5.0
Page Updated
Do you use memdb? Leave a review!
View open issues (10)
View memdb activity
View TODOs for memdb (3)
View on github
Book a Mock Interview With Me (Silicon Valley Engineering Leader, 100s of interviews conducted)
Software engineers: It's time to get promoted. Starting NOW! Subscribe to my mailing list and I will equip you with tools, tips and actionable advice to grow in your career.
Evaluating memdb for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

MemDB logo

Build Status Dependencies Status

Distributed Transactional In-Memory Database

Performance and Scalable

  • Fast in memory data access, up to 25,000 ops (single doc read/write) per shard (each shard take one CPU core).
  • System capacity is horizontally scalable, performance grows linearly by adding more shards.
  • No single point bottleneck, all part of system is scalable, unlimited capability potential.

True Distributed ACID Transaction

  • True ACID (stands for Atomicity, Consistency, Isolation, Durability) transaction support on distributed environment.
  • MemDB brings ACID transaction support for MongoDB, on distributed environment! You can get full transaction support of traditional SQL database (like MySQL), while not losing the scalability of NoSQL database (like MongoDB).

MongoDB and Mongoose Compatible

  • It's just a 'MongoDB' with a cache layer which support distributed transaction.
  • Directly use of MongoDB's query API.
  • Built-in Mongoose support, easy to port existing Mongoose project to MemDB.

High Availability

  • Each shard is backed by one or more slaves, no single point of failure.


Quick Start

Install Dependencies

Make sure Redis and MongoDB has started

Install MemDB

  • MemDB should be installed globally sudo npm install -g memdb-server

Configure MemDB

Copy default config file from node_modules/memdb-server/memdb.conf.js to ~/.memdb/ (mkdir if not exist), and modify it on your need. Please read comments carefully.

Start MemDB

Use memdbcluster to control lifecycle of memdb server cluster

memdbcluster [start | stop | status] [--conf=memdb.conf.js] [--shard=shardId]

Play with memdb shell

See the video bellow, note how ACID transaction work cross multiple shards. memdbshell.gif


Mdbgoose is a modified Mongoose version that work for memdb

var memdb = require('memdb-client');
var P = memdb.Promise;
var mdbgoose = memdb.goose;

// Define player schema
var playerSchema = new mdbgoose.Schema({
    _id : String,
    name : String,
    areaId : Number,
    deviceType : Number,
    deviceId : String,
    items : [mdbgoose.SchemaTypes.Mixed],
}, {collection : 'player'});
// Define player model
var Player = mdbgoose.model('player', playerSchema);

var main = P.coroutine(function*(){
    // Connect to memdb
    yield mdbgoose.connectAsync({
        shards : { // specify all shards here
            s1 : {host : '', port: 31017},
            s2 : {host : '', port: 31018},

    // Make a transaction in s1
    yield mdbgoose.transactionAsync(P.coroutine(function*(){

        var player = new Player({
            _id : 'p1',
            name: 'rain',
            areaId : 1,
            deviceType : 1,
            deviceId : 'id1',
            items : [],

        // insert a player
        yield player.saveAsync();

        // find player by id
        var doc = yield Player.findByIdAsync('p1');
        console.log('%j', doc);

        // find player by areaId, return array of players
        var docs = yield Player.findAsync({areaId : 1});
        console.log('%j', docs);

        // find player by deviceType and deviceId
        player = yield Player.findOneAsync({deviceType : 1, deviceId : 'id1'});

        // update player
        player.areaId = 2;
        yield player.saveAsync();

        // remove the player
        yield player.removeAsync();

    }), 's1');

if (require.main === module) {

To run the sample above:

  • Add the following index config in memdb.conf.js collections : { player : { indexes : [ { keys : ['areaId'], }, { keys : ['deviceType', 'deviceId'], unique : true, }, ] } }
  • restart memdb cluster memdbcluster stop memdbcluster start
  • Make sure you have started shard 's1' on localhost:31017
  • Install npm dependencies npm install memdb-client
  • Run with node >= 0.12 (should add --harmony option on node 0.12.x) node --harmony sample.js

Check here to see how to port your Mongoose project to Mdbgoose



Relationship between MemDB and MongoDB

MemDB is like a 'cache layer' built up on MongoDB which support distributed ACID transaction.

MemDB has its own API which similar to MongoDB, however, you can still use MongoDB's native query API by directly access backend storage, here are the guidelines:

  • Do simple query and update through MemDB API, which is ACID transaction safe.
  • Do complex query through backend MongoDB, the read is not transaction safe.
  • Do complex update through backend MongoDB offline (All MemDB shards are shutdown).

Here are some basic rules for memdb:

  • Data is not bind to specified shard, you can access any data from any shard.
  • All operations inside a single transaction must be executed on one single shard.
  • Access the same data from the same shard if possible, which will maximize performance.

Further read

Quick Pomelo

Quick Pomelo is a Scalable, Transactional and Reliable Game Server Framework based on Pomelo and MemDB


Copyright 2015 rain1017.

Licensed under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License. You may obtain a copy of the License at


Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See the AUTHORS file for names of contributors.

memdb open issues Ask a question     (View All Issues)
  • almost 5 years Is there any application example using it?
  • about 5 years Please search answers from Wiki before submit issues here
memdb open pull requests (View All Pulls)
  • Update README.md
memdb list of languages used
memdb latest release notes
v0.5.0 v0.5.0

MemDB become PUBLIC

More projects by rain1017 View all
Other projects in JavaScript
Powered by Autocode - Instant Webhooks, Scripts and APIs
Autocode logo wordmark