sql >> データベース >  >> NoSQL >> Redis

ServiceStack Redis、Luaテーブルをリストとして返す方法

    Luaから、Lua配列またはJSONオブジェクトを返す必要があります。 「myTable」は、Luaインタープリター内でのみ有効なハンドルのように聞こえます。そのハンドルは呼び出しの直後にクリーンアップされるため、クライアントに伝達されません。

    編集:単純なLuaテーブル/配列がサポートされている必要があります。スクリプトを見ずに、そのとき何が起こっているのかわからない。

    Luaスクリプトのアトミック性に関する追加情報については、このSOリンクも参照してください。

    これがお役に立てば幸いです、TW

    OPの編集後:

    これはOPの元のLuaスクリプトでした:

    local a={}
    for i = 1, 1, 1 do
      a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
      a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
    end
    return a
    

    回答: Luaの戻り値でネストされた値を返すことはできません。 ServiceStack関数からわかるように、Luaスクリプトはリストを返し、リストはネストされていません。

    ここに2つの解決策があります。1つはJSONを使用するとわずかなオーバーヘッドが発生します(ただし、プログラミングの場合は簡単で、安全ではありません)。

    a:cjsonの使用

    local a={}
    for i = 1, 1, 1 do
      a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
      a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
    end
    return cjson.encode(a)
    

    MsgPackも非常に優れたコンパクトなシリアル化形式であり(私たちはこれを頻繁に使用します)、次のように返すことができます:

    a-alt:cmsgpackの使用

    return cmsgpack.pack(a)
    

    b:単純な配列を使用する

    local a={}
    for i = 1, 1, 1 do
      a[1] = "47700415"
      a[2] = redis.call('hget', 'asr:47700415', 'MDEngines')
      a[3] = "47700415_000"
      a[4] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
    end
    return a
    

    これは次を返します:

    a

    [email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
    "{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"
    

    b

    [email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
    1) "47700415"
    2) "Hello"
    3) "47700415_000"
    4) "World"
    

    ご覧のとおり、HSETにダミーデータを入れました 。

    このリンクをお勧めすることもできます。そこにいくつかの素晴らしい情報があります:intro-to-lua-for-redis-programmers

    Lua dictに値を追加する良い方法は、ここで見ることができます:

    local fkeys = redis.call('sinter', unpack(KEYS))
    local r = {}
    for i, key in ipairs(fkeys) do
      r[#r+1] = redis.call('hgetall',key)
    end
    return r
    



    1. AWS CloudFormationテンプレートを使用してRDBToolsをインストールするにはどうすればよいですか?

    2. PHPアプリケーションからのページリクエストデータをログに記録するスケーラブルな方法は?

    3. ClusterControlのパフォーマンスとヘルスモニタリング

    4. Dockerコンテナ間でRedisデータを存続させます-Dockerコンテナでダウンとアップを作成します