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

1つのRedisLuaスクリプトで複数のDBを使用しますか?

    通常、関連データを異なるRedisデータベースに配置することは間違った考えです。キーの命名規則によって名前名を定義することと比較して、ほとんど利点はありません(セキュリティ、永続性、有効期限管理などに関する追加の粒度はありません...)。また、主な欠点は、クライアントが正しいデータベースの選択を手動で処理する必要があることです。これは、同時に複数のデータベースを対象とするクライアントにとってエラーが発生しやすいことです。

    それでも複数のデータベースを使用したい場合は、redis-pyおよびLuaスクリプトでデータベースを機能させる方法があります。

    redis-pyは、基になるスレッドセーフ接続プールの実装のため、SELECTコマンド(通常は現在のデータベースを切り替えるために使用されます)のラッパーを定義しません。ただし、LuaスクリプトからSELECTを呼び出すことを妨げるものは何もありません。

    次の例を考えてみましょう:

    $ redis-cli
    SELECT 0
    SET mykey db0
    SELECT 1
    SET mykey db1
    

    次のスクリプトは、同じクライアント接続からの2つのデータベースのmykeyの値を表示します。

    import redis
    
    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    
    lua1 = """
       redis.call("select", ARGV[1])
       return redis.call("get",KEYS[1])
    """
    script1 = r.register_script(lua1)
    
    lua2 = """
       redis.call("select", ARGV[1])
       local ret = redis.call("get",KEYS[1])
       redis.call("select", ARGV[2])
       return ret
    """
    script2 = r.register_script(lua2)
    
    print r.get("mykey")
    print script2( keys=["mykey"], args = [1,0] )
    print r.get("mykey"), "ok"
    print
    print r.get("mykey")
    print script1( keys=["mykey"], args = [1] )
    print r.get("mykey"), "misleading !!!"
    

    スクリプトlua1は単純です。値を返す前に、特定のデータベースを選択するだけです。実行後、接続に関連付けられている現在のデータベースが変更されているため、その使用法は誤解を招く可能性があります。これをしないでください。

    スクリプトlua2の方がはるかに優れています。ターゲットデータベースと現在のデータベースをパラメータとして受け取ります。スクリプトが終了する前に現在のデータベースが再アクティブ化されていることを確認して、接続に適用された次のコマンドが引き続き正しいデータベースで実行されるようにします。残念ながら、Luaスクリプトには現在のデータベースを推測するコマンドがないため、クライアントは体系的に提供する必要があります。 Luaスクリプトは、(以前のエラーの場合でも)最後に現在のデータベースをリセットする必要があるため、複雑なスクリプトが煩雑で扱いにくいことに注意してください。




    1. Redis対Memcached

    2. だからあなたのHBaseは壊れています

    3. aws-elasticacheでmemcachedまたはRedisを使用する

    4. クラウドデータベースを管理するためにAWSにClusterControlをデプロイする方法