RedisDOWN
Redis backend for LevelUP
Requirements:
- redis-2.8 or more recent.
- node-0.10, node-0.11, iojs-1.0.1
Uses a sorted-set to order the keys and a hash to store the values.
Fetches the ordered key value pairs during iterations with a single redis lua call.
Abstract-LevelDOWN testsuite is green except for the 'implicit iterator snapshot'.
Warning: data migration from redisdown-v0.1.9
redisdown-redisdown-v0.1.10 no longer JSON encode/decode itself. Levelup take care of that. JSON Data written in v0.1.9 is not correctly decoded back to a javascript object in v0.1.10 and above.
This change was introduced to support binary values in redisdown and escaped the fact that it was breaking backward compatibility for the data.
Workaround: https://github.com/hmalphettes/redisdown/issues/24#issuecomment-193076281
Example
Copied and pasted from the levelup documentation. Added the db option when creating the db to use redisdown.
var levelup = require('levelup')
var redisdown = require('redisdown')
// 1) Create our database, supply location and options.
// This will create or open the underlying LevelDB store.
var db = levelup('mydb', { db: redisdown, host: 'localhost', port: 6379 })
// If you use sentinel/cluster mode, you muse a single slot to store the values thanks to a `{hash}`
//var db = levelup('{thehash}path', { db: redisdown });
// if you already have a redis client
//var db = levelup('mydb', { db: redisdown, redis: redisClient })
// if you use an URL environment variable
//var db = levelup('mydb', { db: redisdown, url: process.env.REDIS_URL })
// if you use Redis Cloud on Heroku
//var db = levelup('mydb', { db: redisdown, url: process.env.REDISCLOUD_URL })
// 2) put a key & value
db.put('name', 'LevelUP', function (err) {
if (err) return console.log('Ooops!', err) // some kind of I/O error
// 3) fetch by key
db.get('name', function (err, value) {
if (err) return console.log('Ooops!', err) // likely the key was not found
// ta da!
console.log('name=' + value)
})
})
API
redisdown(location)
redisdown()
returns a new RedisDOWN instance. location
is a String pointing at the root namespace of the data in redis.
-
location+':h'
is the hash where the values are stored. -
location+':z'
is the set where the keys are sorted.
redisdown#open([options, ]callback)
open()
is an instance method on an existing database object.
options is a hash that is passed to the redis library to create a redis client:
-
highWaterMark
number of values to fetch in one redis call for iteration. Defaults to 256. -
port
redis port. Defaults to '127.0.0.1' -
host
redis host. Defaults to 6379 -
redis
already configured redis client. redisDown will not open or close it. host and port and all other redis options are ignored. - Other options: https://github.com/mranney/node_redis#rediscreateclientport-host-options
redisdown.destroy(location, [options, ]callback)
destroy()
is used to completely delete all data in redis related to the location.
redisdown#batch([{type: 'put', key: 'foo1', value: 'bar1' [, prefix: 'subsection']}, ...])
batch()
supports an exra property prefix
to store/retrieve/delete a key in a specific namespace of the redis DB.
It is useful to support sublevel-ish batch operations: https://github.com/dominictarr/level-sublevel#batches
and is well supported by redis.
By default, the prefix is a string that is the path to the where redis stores the document.
In order to resolve other types of prefixes, one would need to override the #__getPrefix(prefix)
method.
Passing a levelup instance is demonstrated here: https://github.com/hmalphettes/redisdown/blob/master/test/batch-prefix-test.js#L12
Pouchdb integrations tests: all 3605 of them
npm run-script test-pouchdb-redis
The script will install the extra required dependencies. It works for me.
LICENSE
redisdown is freely distributable under the term of the MIT License. Copyright: Sutoiku Inc 2014.
If you need something different, let me know.
HELP Wanted
- Collation: do we need to worry about this?