2013-07-09 10 views
50

私はdjangoキャッシュのメモリ内データベースバックエンドとしてredisを使用しています。redis-cliですべてのキーを表示する方法は?

CACHES = { 
    'default': { 
     'BACKEND': 'redis_cache.cache.RedisCache', 
     'KEY_PREFIX': DOMAIN_NAME, 
     'LOCATION': 'unix:/tmp/redis_6379.sock:1', 
     'OPTIONS': { 
      'PICKLE_VERSION': -1, # default 
      'PARSER_CLASS': 'redis.connection.HiredisParser', 
      'CLIENT_CLASS': 'redis_cache.client.DefaultClient', 
     }, 
    }, 
} 

私のDjangoのキャッシュが正しく動作するように見える:次のように

は特に、私が設定さdjango-redisを使用しています。

redis-cliコマンドラインを使用して、djangoキャッシュキーが表示されないことがあります。

[編集] ノー差

$ redis-cli 

$ redis-cli -s /tmp/redis_6379.sock 

[endedit]

との両方を試してみましたことを、以下に注意してください。

$ redis-cli 
redis 127.0.0.1:6379> keys * 
(empty list or set) 

しかし

redis 127.0.0.1:6379> set stefano test 
OK 
redis 127.0.0.1:6379> keys * 
1) "stefano" 

Djangoのシェルからながら:

In [1]: from django.core.cache import cache 

In [2]: cache.keys('*') 
Out[2]: 
[u'django.contrib.sessions.cachebblhwb3chd6ev2bd85bawuz7g6pgaij8', 
u'django.contrib.sessions.cachewpxiheosc8qv5w4v6k3ml8cslcahiwna'] 

私はCLIでMONITORを使用している場合:KEYS *コマンドを使用して、特に

redis 127.0.0.1:6379> monitor 
OK 
1373372711.017761 [1 unix:/tmp/redis_6379.sock] "KEYS" "project_prefix:1:*" 

私はdjangoキャッシュプレフィックスを使ってリクエストを見ることができます。これは、赤字が同じサービスに接続されていることを証明するはずです。 redis-cliの接頭辞を検索すると、(empty list or set)が返されます。

なぜですか?

同じredisインスタンス上の異なるキャッシュをコンパートメント化するメカニズムは何ですか?

+0

redis-cliコマンドに関するいくつかのコメントと、回答への返信に使用されるパラメータは、 – Stefano

答えて

65
私は2つの可能性があると言うでしょう

1 /あなたはそれが接続されている、またはあなたが起動Redisの-cliのクライアントが同じに接続しないと思うRedisのインスタンスに接続できないことがありDjangoのアプリRedisインスタンス。

どちらの場合も、同じ接続メカニズムを使用しないでください。 DjangoはUnix Domain Socketを使用し、redis-cliはTCPループバックを使用します(デフォルトで)。あなたが確認するために、同じソケットのパスを使用してのRedis-CLIを起動することもできます。あなたはジャンゴで送信されたコマンドを参照してくださいMONITORコマンドで確認しているので、

$ redis-cli -s /tmp/redis_6379.sock 

今、我々はあなたが接続されていると仮定することができます正しいインスタンス。

2/Redisにはデータベースの概念があります。デフォルトでは、16の異なるデータベースがあり、現在のデフォルト・データベースは0です。SELECTコマンドを使用して、セッションを別のデータベースに切り替えることができます。データベースごとに1つのキースペースがあります。

INFO KEYSPACEコマンドを使用すると、いくつかのデータベースでいくつかのキーが定義されているかどうかを確認できます。

redis 127.0.0.1:6379[1]> info keyspace 
# Keyspace 
db0:keys=1,expires=0 
db1:keys=1,expires=0 

ここで私はのは、DB0データベースで定義されたキーをチェックしてみましょう、2つのデータベースを持っている:

redis 127.0.0.1:6379> keys * 
1) "foo" 

となりましDB1データベースに:

redis 127.0.0.1:6379> select 1 
OK 
redis 127.0.0.1:6379[1]> keys * 
1) "bar" 

私の提案は、にもなりますDjangoアプリケーションが、接続時にRedisインスタンス(MONITOR付き)にSELECTコマンドを送信するかどうかを確認してください。

私はDjangoに精通していませんが、LOCATIONパラメータを定義した方法では、データがデータベース1にある可能性があります(接尾辞のため)。

+1

ありがとうございますDidier。私はソケットに直接接続しようとしたので、1)を除外しました。違いは見えませんでした。しかし、私は "SELECT"コマンドについて知らなかった!それは完全にそれです!現在作業中...この点に関するRedisのドキュメントはあまり明確ではないと言わざるを得ない。[Redis SELECT](http://redis.io/commands/select)コマンドのドキュメントをチェックしても、混乱したコメント! – Stefano

+0

答えに「SELECT」コマンドのドキュメントへのリンクを追加しましたが、複数のデータベースへの正式な参照は見つかりませんでした。たぶんそれは私だけです、リンクを追加してくださいありがとう! – Stefano

+1

データベースを記述する専用のページはありません。しかし、設定ファイルには便利なコメントが1つあります:https://github.com/antirez/redis/blob/unstable/redis.conf#L86 –

2

のRedis-CLI -h KEYS "trendingKey *"

OUTPUT 1) "trendingKey:2:1" 2) "trendingKey:trending102:1" 3) "trendingKey:trending101:1"

関連する問題