61

django キャッシュのメモリ内データベース バックエンドとして redis を使用しています。

特に、次のように構成されたdjango-redisを使用します。

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 キャッシュは正しく動作しているようです。

redis-cli奇妙なことは、コマンド ラインを使用して django キャッシュ キーを確認できないことです。

[編集] 以下で、両方を試したことに注意してください

$ redis-cli

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

[編集]

違いはありません。

特に、次のKEYS *コマンドを使用します。

$ 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している場合:

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

django キャッシュ プレフィックスを使用して、リクエストを確認できます。これにより、redis-cli が同じサービスに接続されていることが証明されます。しかし、でそのプレフィックスを検索してもredis-cli(empty list or set)

何故ですか?

同じ redis インスタンスで異なるキャッシュを区分化するメカニズムは何ですか?

4

2 に答える 2

80

私は2つの可能性があると言います:

1/ django アプリが、接続されていると思われる Redis インスタンスに接続しないか、起動した redis-cli クライアントが同じ Redis インスタンスに接続しない場合があります。

どちらの場合も、まったく同じ接続メカニズムを使用しないことに注意してください。Django は Unix ドメイン ソケットを使用しますが、redis-cli は (デフォルトで) TCP ループバックを使用します。確認のために、同じソケット パスを使用して redis-cli を起動することをお勧めします。

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

Django から送信されたコマンドが表示されることを MONITOR コマンドで確認したので、正しいインスタンスに接続していると見なすことができます。

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

ここには 2 つのデータベースがあります。db0 データベースで定義されているキーを確認してみましょう。

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にある可能性があると思います(接尾辞のため)。

于 2013-07-09T17:22:49.393 に答える
3

これを行う:

redis-cli -h <host> KEYS "trendingKey*"

出力

  1. "trendingKey:2:1"
  2. "trendingKey:trending102:1"
  3. "trendingKey:trending101:1"
于 2016-08-01T06:19:42.260 に答える