Redis backend for LevelUP
JavaScript Lua Shell
Clone or download
Latest commit 5c1e609 Dec 28, 2017
Failed to load latest commit information.
.jshintrc Initial commit - iterator and range are broken May 22, 2014
.travis.yml start redis-server before we run the tests Jan 16, 2015
iterator.js Fixed an iterator bug for keys with non standard binary values #17 Jan 18, 2016

RedisDOWN Build Status

Redis backend for LevelUP


  • 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.



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 must use 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)



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 ''
  • 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:

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: 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:

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.


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?