通常、関連データを異なる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スクリプトは、(以前のエラーの場合でも)最後に現在のデータベースをリセットする必要があるため、複雑なスクリプトが煩雑で扱いにくいことに注意してください。