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',
},
},
}
My Django=キャッシュは正常に動作しているようです。
奇妙なことに、redis-cli
コマンドラインを使用してDjangoキャッシュキーを表示できません。
[編集]以下の両方で試したことに注意してください
$ redis-cli
そして
$ redis-cli -s /tmp/redis_6379.sock
[endedit]
違いはありません。
特に、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"
while Django Shell:
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 cache prefix;を使用してリクエストを確認できます。redis-cliが同じサービスに接続されていることを証明する必要があります。しかし、redis-cli
(empty list or set)
なぜですか?
同じredisインスタンスで異なるキャッシュを区分するメカニズムは何ですか?
次の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にある可能性があると思います(接尾辞のため)。
redis-cli -h KEYS "trendingKey *"
出力1) "trendingKey:2:1" 2) "trendingKey:trending102:1" 3) "trendingKey:trending101:1"