add README.md
This commit is contained in:
		
							parent
							
								
									d49b97b10e
								
							
						
					
					
						commit
						ced0f36cbf
					
				
							
								
								
									
										115
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | |||||||
|  | memstore Cluster | ||||||
|  | ================ | ||||||
|  | 
 | ||||||
|  | A very simple in-memory object store for use with node cluster | ||||||
|  | (or even completely and unrelated node processes). | ||||||
|  | 
 | ||||||
|  | Node.js runs on a single core, which isn't very effective. | ||||||
|  | 
 | ||||||
|  | You can run multiple Node.js instances to take advantage of multiple cores, | ||||||
|  | but if you do that, you can't share memory between processes. | ||||||
|  | 
 | ||||||
|  | This module will either run client-server style in environments that benefit from it | ||||||
|  | (such as the Raspberry Pi 2 with 4 cores), or in-process for environments that don't | ||||||
|  | (such as the Raspberry Pi B and B+). | ||||||
|  | 
 | ||||||
|  | **Note**: Most people would probably prefer to just use Redis rather than | ||||||
|  | wrap a dumb memstore as a service... but I am not most people. | ||||||
|  | 
 | ||||||
|  | Also works with **level-session-store** (leveldb), **connect-session-knex** (SQLite3), | ||||||
|  | **session-file-store** (fs), and any other embedded / in-process store. | ||||||
|  | 
 | ||||||
|  | Usage | ||||||
|  | ===== | ||||||
|  | 
 | ||||||
|  | The default behavior is to try to connect to a master and, if that fails, to become the master. | ||||||
|  | 
 | ||||||
|  | However, if you are in fact using the `cluster` rather than spinning up random instances, | ||||||
|  | you'll probably prefer to use this pattern: | ||||||
|  | 
 | ||||||
|  | ```js | ||||||
|  | var cluster = require('cluster'); | ||||||
|  | var store = require('memstore-cluster'); | ||||||
|  | var numCores = require('os').cpus().length; | ||||||
|  | 
 | ||||||
|  | var opts = { | ||||||
|  |   sock: '/tmp/mydb.memstore.sock' | ||||||
|  | 
 | ||||||
|  |   // If left 'null' or 'undefined' this defaults to a similar memstore | ||||||
|  |   // with no special logic for 'cookie' or 'expires' | ||||||
|  | , store: cluster.isMaster && new require('express-session/session/memory')() | ||||||
|  | 
 | ||||||
|  |   // a good default to use for instances where you might want | ||||||
|  |   // to cluster or to run standalone, but with the same API | ||||||
|  | , serve: cluster.isMaster | ||||||
|  | , connect: cluster.isWorker | ||||||
|  | , standalone: (1 === numCores) // overrides serve and connect | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | memstore.create(opts).then(function (store) { | ||||||
|  |   // same api as new sqlite3.Database(options.filename) | ||||||
|  | 
 | ||||||
|  |   store.get(id, function (err, data) { | ||||||
|  |     console.log(data); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   // app.use(expressSession({ secret: 'keyboard cat', store: store })); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | process.on('unhandledPromiseRejection', function (err) { | ||||||
|  |   console.error('Unhandled Promise Rejection'); | ||||||
|  |   console.error(err); | ||||||
|  |   console.error(err.stack); | ||||||
|  | 
 | ||||||
|  |   throw err; | ||||||
|  | }); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | If you wish to always use clustering, even on a single core system, see `test-cluster.js`. | ||||||
|  | 
 | ||||||
|  | Likewise, if you wish to use standalone mode in a particular worker process see `test-standalone.js`. | ||||||
|  | 
 | ||||||
|  | API | ||||||
|  | === | ||||||
|  | 
 | ||||||
|  | This is modeled after Express' | ||||||
|  | [Session Store Implementation](https://github.com/expressjs/session#session-store-implementation) | ||||||
|  | 
 | ||||||
|  | **Note**: These are only exposed if the underlying store supports them. | ||||||
|  | 
 | ||||||
|  | CRUD methods | ||||||
|  | ------------ | ||||||
|  | 
 | ||||||
|  | * `store.set(id, data, fn)    => (error)` | ||||||
|  | * `store.get(id, fn)          => (error, data)` | ||||||
|  | * `store.touch(id, data, fn)  => (error)` | ||||||
|  | * `store.destroy(id, fn)      => (error)` | ||||||
|  | 
 | ||||||
|  | Helpers | ||||||
|  | ------- | ||||||
|  | 
 | ||||||
|  | * `store.all(fn)              => (error, array)` | ||||||
|  | * `store.clear(fn)            => (error)` | ||||||
|  | * `store.length(fn)           => (error, length)` | ||||||
|  | 
 | ||||||
|  | See <https://github.com/expressjs/session#session-store-implementation>@4.x for full details | ||||||
|  | 
 | ||||||
|  | Standalone / Master Mode is in-process | ||||||
|  | ======================== | ||||||
|  | 
 | ||||||
|  | The `master` in the cluster (meaning `opts.serve = true`) will directly hold the `express-session/session/memory` | ||||||
|  | memory store. | ||||||
|  | 
 | ||||||
|  | Likewise, when only one process is being used (`opts.standalone = true`) the listener is | ||||||
|  | not started and API is completely in-process. | ||||||
|  | 
 | ||||||
|  | If you take a look at `wrapper.js` you'll see that it's a rather simple memory store instance. | ||||||
|  | 
 | ||||||
|  | Security Warning | ||||||
|  | ================ | ||||||
|  | 
 | ||||||
|  | Note that any application on the system could connect to the socket. | ||||||
|  | 
 | ||||||
|  | In the future I may add a `secret` field in the options object to be | ||||||
|  | used for authentication across processes. This would not be difficult, | ||||||
|  | it's just not necessary for my use case at the moment. | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user