shavaluator-js
This library provides a convenient wrapper for sending Lua scripts to a Redis server via EVALSHA
.
It works in tandem with mranney/node-redis. Note that node-redis already tries to use evalsha if you use eval. This library merely prevents your code from computing a SHA1 every time you execute a script.
What is EVALSHA?
EVALSHA
allows you to send Lua scripts to a Redis server by sending the SHA-1 hashes instead of actual script content. As long as the body of your script was previously sent to Redis via EVAL
or SCRIPT LOAD
, you can use EVALSHA
to avoid the overhead of sending your entire Lua script over the network.
A Shavaluator
object wraps a Redis client for executing Lua scripts. When executing Lua scripts, a shavaluator will always attempt EVALSHA
first, falling back on EVAL
if the script has not yet been cached by the Redis server.
This project was forked from jeffomatic/shavaluator-js for these reasons:
- simplify the library - 23 files changed, 461 insertions(+), 1211 deletions(-)
- coffee-script is dumb
- use redis
sendCommand
instead ofeval
method as it tries to be too smart and check the sha that we already computed. - ability to use same instance with multiple redis instances
Example
var Shavaluator = // 1. Initialize a shavaluator with a Redis clientvar shavaluator = redis; // 2. Add a series of named Lua scripts to the shavaluator.shavaluator; // 3. The 'delequal' script is now available to call using `exec`. When you// call this, first EVALSHA is attempted, and then it falls back to EVAL.shavaluator;
Adding scripts
Before you can run Lua scripts, you should give each one a name and add them to a shavaluator.
scripts = delequal: " \ if redis.call('GET', KEYS[1]) == ARGV[1] then \ return redis.call('DEL', KEYS[i]) \ end \ return 0 \ " zmembers: " \ local key = KEYS[1] \ local results = {} \ if redis.call('ZCARD', key) == 0 then \ return {} \ end \ for i = 1, #ARGV, 1 do \ local memberName = ARGV[i] \ if redis.call('ZSCORE', key, memberName) then \ table.insert(results, memberName) \ end \ end \ return results; "; for var name in scripts shavaluator;
Adding a script only generates the SHA-1 of the script body; it does not perform any network operations.
Class reference
constructor(redisClient)
add(name, body)
Adds a Lua script to the shavaluator.
exec(scriptName, keysArray, argsArray, callback)
Executes the script named scriptName
.
The callback
parameter is standard asynchronous callback, taking two arguments:
- an error, which is null on success
- the script result