0.0.2 • Published 9 years ago

moon-bucket v0.0.2

Weekly downloads
1
License
MIT
Repository
github
Last release
9 years ago

:honey_pot: moon-bucket :last_quarter_moon_with_face:

A bucket of Lua scripts for Redis.

Usage

Shell:

redis-cli eval "$(cat scripts/join.lua)" [args]

node-redis

var lua = require('moon-bucket');
var redis = require('redis');
var client = redis.createClient();

lua.init(client);

var hashMaps = lua.join('ids', 'things');

Docs

join

Redis doesn't have joins. However, we can script them with Lua.

This script lets us get hashes by their id.

Prereqs: our hashes must be namespaced namespace:*, where namespace is our namespace (for example, cars), and * is an inremental id (which resides in a foreign list of ids, such as 1 2 3 4 5 etc.)

Shell:

# redis-cli eval "$(cat scripts/join.lua)" [2|3] [foreign-key] [namespace] [optional limit]

redis-cli eval "$(cat scripts/join.lua)" 3 ids things 5

JavaScript:

var lua = require('./index.js');
var redis = require('redis');
var client = redis.createClient();

lua.init(client);

/**
 * This example requires that there exists an "ids" list of `1, 2, 3`
 * and 3 hashmaps --
 *
 * things:1
 * things:2
 * things:3
 */

var hashMaps = lua.join('ids', 'things');

/**
 * This will return the hashes things:1, things:2, and things:3
 */
console.log(hashMaps);

This will return hashes things:*, where each things:* has an ID from the list of ids with a limit of 5.

This would return 5 of our hashes, looking like this (maybe JSON, if we're using node.js):

{
  "hello": "world",
  "some_other": "property",
  "_key": "things:1"
}

As you can see, a property called _key gets automatically embedded into the hash when it is returned to us so we know to which key this object belongs.

Just want to get all of the hashes?

redis-cli eval "$(cat scripts/join.lua)" 2 ids things

By default, our limit is -1, which is the last item in the list.

Technical stuff

Internally when using node.js to call any of the methods available (like join), we're actually calling node redis' evalsha method on the corresponding sha1 hash in /sha/index.js. This is more performant, because we don't have to actually read any files from the file system (in other words, we never make a call to read anything from the scripts directory directly; instead, we just make redis evaluate the sha1 hash of the script). So, moonBucket.join(/* args */) actually calls something like redis-cli evalsha b0eff2712326fb5b1cda561a013a0fcc16cb8d85 [...args]:

// ./sha/index.js

module.exports = {
  // this is the hash of the corresponding lua script
  "join":"b0eff2712326fb5b1cda561a013a0fcc16cb8d85"
};

If you want to add your own script to scripts, you'll need to implement the method in ./index.js and then run ./.bin/compile-sha in order to re-create the sha map.

What's in a name?

"Lua" is the name of the scripting language, and the portuguese word for "moon". "Balde lua" means moon bucket.

© 2015 Josh Beam - MIT License | www.joshbe.am | talk@joshbe.am