LoginSignup
4
1

More than 5 years have passed since last update.

Redis Module から mruby を呼び出す

Posted at

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 相当にする

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1