Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/haraka/haraka-nosql
NoSQL for Haraka, with RAM, SSC, and Redis backends
https://github.com/haraka/haraka-nosql
haraka haraka-plugin nosql
Last synced: 4 days ago
JSON representation
NoSQL for Haraka, with RAM, SSC, and Redis backends
- Host: GitHub
- URL: https://github.com/haraka/haraka-nosql
- Owner: haraka
- Created: 2015-04-21T15:35:58.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-08-29T17:56:42.000Z (about 2 years ago)
- Last Synced: 2024-02-04T16:36:53.285Z (9 months ago)
- Topics: haraka, haraka-plugin, nosql
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/haraka-nosql
- Size: 29.3 KB
- Stars: 8
- Watchers: 8
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# haraka-nosql
[![Build Status][ci-img]][ci-url]
[![Coverage Status][cov-img]][cov-url]Store stuff in memory-backed objects, smartly.
## Usage
var NoSQL = require('haraka-nosql');
var nosql = new NoSQL('myindex', {
storage: 'redis', // or 'ram' or 'ssc'
expire: 10, // minutes
});Exports the following functions:
## set
nosql.set('foo', 'bar', function (err, result) {
if (err) {
// error handling code
return;
}
// do fun stuff with result
});You're confident it'll work out? Skip the callback, it's optional. For all of these methods.
nosql.set('foo', 'bar'); // going commando
## get
nosql.get('foo', function (err, result) {
if (err) { return; }
// result == 'bar' (because that's what we set it to)
});## del
nosql.del('foo', function (err, result) {
if (err) { return; }
// result == 1 (# of objects keys deleted)
});## incrby
nosql.incrby('my_counter', 1, function (err, result) {
if (err) { return; }
// result == 1 (it was undef, now it's initialized to 1)
});nosql.incrby('my_counter', 2); // breezy!
// now my_counter == 3 (increment 1 with 2 and math!)## reset
nosql.reset();
// all your keys are belong to /dev/null
# RAM? That ain't workin'
## Pros
* simple
* no dependencies## Cons
* Data disappears when Haraka is restarted.
* Not shared across hosts
* With [cluster](https://nodejs.org/api/cluster.html), worker processes share no data. Therefore, each worker process has a partial (incomplete) view of the state data.# Cluster RAM
* When running with cluster, `nosql` attempts to load [strong-store-cluster](http://apidocs.strongloop.com/strong-store-cluster/), which stores data in the master worker.
## Pros
* All Haraka processes share a single RAM backed data store.
## Cons
* There's no "reset" operation. Instead, keys expire after 10 minutes (edit
`config/nosql.ini [cluster]expire` to alter. This is great for features such
as concurrency or brute-force auth tracking.# Redis
## Pros
* disk backed RAM storage
* same view across Harka master & worker processes
* persistence across Haraka & server reboots
* network service, can be shared by many hosts## Enable Redis
sed -i.bak -e 's/; backend=redis/backend=redis/' /my/haraka/config/nosql.ini
### Redis isn't running on localhost!
$EDITOR config/nosql.ini
Edit the settings in the [redis] section.
### I need more Redis features
When Redis is configured, the redis connection is exported as `nosql.redis`. Use it like so:
var nosql = require('haraka-nosql');
var redis = nosql.redis;redis.multi()
.hget('something')
.get('else')
.exec(function (err, res) {
});Refer to the excellent [Redis command docs](http://redis.io/commands)
# Other
## What about key collisions?
Collisions are only possible within your namespace. Each caller of `nosql` automatically gets its own namespace. In RAM, each namespace is a JS object, rather like this:
{
karma: {
key: val,
key2: val2,
},
limit: {
key: val,
key2: val2,
}
}In Strong Store Cluster, each caller gets its own collection.
In Redis, get|del|incrby operations are mapped to their hash equivalents (hget, hdel, hincrby).
[ci-img]: https://github.com/haraka/haraka-nosql/actions/workflows/ci.yml/badge.svg
[ci-url]: https://github.com/haraka/haraka-nosql/actions/workflows/ci.yml
[cov-img]: https://coveralls.io/repos/haraka/haraka-nosql/badge.png
[cov-url]: https://coveralls.io/r/haraka/haraka-nosql