FinalZJY / cluster-shared-memory

Shared memory for Node.js cluster module.
MIT License
23 stars 8 forks source link

cluster-shared-memory

npm node-current GitHub repo size

Cross-process storage acts like shared memory for Node.js applications which use the cluster module.

If you are looking for a tool to share the physical memory, cluster-shared-memory can not meet your needs. You can only use it to share data between processes.

It provides in-memory storage managed by the master process, and the workers communicate with the master through IPC. It's basically used in the Node.js cluster applications to share data between processes.

It supports reading and writing objects in shared memory storage, mutually exclusive access between processes, listening objects in shared memory storage, and an LRU cache.

Usage

const cluster = require('cluster');
require('cluster-shared-memory');

if (cluster.isMaster) {
  for (let i = 0; i < 2; i++) {
    cluster.fork();
  }
} else {
  const sharedMemoryController = require('cluster-shared-memory');
  // Note: it must be a serializable object
  const obj = {
    name: 'Tom',
    age: 10,
  };
  // Set an object
  await sharedMemoryController.set('myObj', obj);
  // Get an object
  const myObj = await sharedMemoryController.get('myObj');
  // Mutually exclusive access
  await sharedMemoryController.mutex('myObj', async () => {
    const newObj = await sharedMemoryController.get('myObj');
    newObj.age = newObj.age + 1;
    await sharedMemoryController.set('myObj', newObj);
  });
}

API

setLRUOptions(options)

Set the options of the LRU cache. Only available on the master process.

Note that this will recreate a new LRU cache.

set(key, value, [callback])

Set an object to the shared memory storage.

get(key, [callback])

Get an object from the shared memory storage.

remove(key, [callback])

Remove an object from the shared memory storage.

getLock(key, [callback])

Get the lock of an object. If you want to perform mutually exclusive operations, you must get the lock first. If the lock is already get by another process, this operation will be blocked until the lock has been returned.

Remember to release the lock after you finishing the operations!

releaseLock(key, lockId, [callback])

Release the lock of an object. After releasing the lock, one of other blocked requests can get the lock.

mutex(key, func)

Auto get and release the Lock of an object.

listen(key, callback)

Listen an object.

setLRU(key, value, [callback])

Set an object to the LRU cache.

getLRU(key, [callback])

Get an object from the LRU cache.

removeLRU(key, [callback])

Remove an object from the LRU cache.