Redis でモジュールとは
いろいろ Redis module の作り方が saidieさんの記事 や redislabの記事にまとまっているので参考にしてください。
さっそく mruby を使ったモジュールを作ってみるまえにディレクトリ構成を決める
+ Makefile
+ mruby.c
+ redismodule.h
+ vendor
+ mruby - github から mruby をもってくる
これだけのファイルでできるはず。
mruby.c の中身
#include <stdlib.h>
#include "redismodule.h"
#include "mruby.h"
#include "mruby/compile.h"
#include "mruby/string.h"
int MrubyEval_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
// アリティのチェック
if (argc < 2) return RedisModule_WrongArity(ctx);
size_t len;
const char *prefix = RedisModule_StringPtrLen(argv[1], &len);
mrb_state* mrb;
mrb_value value;
char *result;
mrb = mrb_open();
value = mrb_load_string(mrb, prefix);
result = (char *)mrb_string_value_ptr(mrb, value);
if (RedisModule_ReplyWithSimpleString(ctx, result) == REDISMODULE_ERR){
mrb_close(mrb);
return REDISMODULE_ERR;
}
mrb_close(mrb);
return REDISMODULE_OK;
}
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
// モジュールの初期化
if (RedisModule_Init(ctx, "mruby", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
// hello.hoge コマンドの登録
if (RedisModule_CreateCommand(ctx, "mruby.eval", MrubyEval_RedisCommand, "write deny-oom random fast", 1, 1, 1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
return REDISMODULE_OK;
}
MrubyEval_RedisCommand で mruby.eval 引数 でわたされたrubyのプログラムを実行できるようにします。
Makefile
CFLAGS = -Ivendor/mruby/include
all: build libmruby.a mruby.o
ld -o mruby.so mruby.o -bundle -undefined dynamic_lookup -lc vendor/mruby/build/host/lib/libmruby.a -lm
mruby.o:
gcc -dynamic -fno-common -std=gnu99 -mmacosx-version-min=10.6 -c -Ivendor/mruby/include -o mruby.o mruby.c
libmruby.a: vendor/mruby
cd vendor/mruby && ${MAKE}
vendor/mruby:
mkdir -p vendor
git clone https://github.com/mruby/mruby.git vendor/mruby
cd vendor/mruby && git reset --hard && git clean -fdx
build:
mkdir -p build
clean:
rm -rf vendor
rm -rf build
make で mruby.so ができます。
redis-cli で
module load "実際のpath/mruby/mruby.so"
とするとモジュールが有効になります。
redis.eval "def a;1+1+1;end; a"
とすれば
3
が帰ってきます。
これから対応していきたいこと、 reids のコマンドを呼べるようにして lua script 相当にする