web-dev-qa-db-fra.com

Comment afficher TOUTES les clés via redis-cli?

J'utilise redis en tant que base de données en mémoire pour Django cache.

En particulier, j'utilise Django-redis configuré comme suit:

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',
        },
    },
}

Mon cache Django semble fonctionner correctement.

La chose étrange est que je ne peux pas voir Django les clés de cache utilisant le redis-cli ligne de commande.

[edit] Veuillez noter ci-après que j'ai essayé les deux avec

$ redis-cli

et

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

[endedit]

sans différence.

En particulier, en utilisant le KEYS * commande:

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

mais

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

à partir de 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']

Si j'utilise MONITOR sur la cli:

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

Je peux voir une requête, en utilisant le préfixe de cache Django; ce qui devrait prouver que redis-cli est connecté au même service. Mais même en cherchant ce préfixe dans le redis-cli retourne un (empty list or set)

Pourquoi est-ce?

Quels sont les mécanismes qui compartimentent les différentes caches sur la même instance redis?

51
Stefano

Je dirais qu'il y a deux possibilités:

1/Il est possible que l'application Django ne se connecte pas à l'instance Redis à laquelle vous pensez qu'elle est connectée ou que le client Redis-cli que vous lancez ne se connecte pas à la même instance Redis.

Veuillez noter que vous n'utilisez pas le même mécanisme de connexion dans les deux cas. Django utilise un socket de domaine Unix, tandis que redis-cli utilise TCP loopback (par défaut). Vous pouvez lancer Redis-cli en utilisant le même chemin de socket. , pour être sûr:

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

Maintenant que vous avez vérifié avec une commande MONITOR que vous voyez les commandes envoyées par Django, nous pouvons supposer que vous êtes connecté à la bonne instance.

2/Il existe un concept de base de données à Redis. Par défaut, vous avez 16 bases de données distinctes et la base de données par défaut actuelle est 0. La commande SELECT peut être utilisée pour passer d'une session à une autre base de données. Il y a un espace clé par base de données.

La commande INFO KEYSPACE peut être utilisée pour vérifier si certaines clés sont définies dans plusieurs bases de données.

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

Ici, j'ai deux bases de données, vérifions les clés définies dans la base de données db0:

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

et maintenant dans la base de données db1:

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

Ma suggestion serait également de vérifier si l'application Django envoie une commande SELECT au moment de la connexion à l'instance Redis (avec MONITOR).

Je ne connais pas bien Django, mais la façon dont vous avez défini le paramètre LOCATION me fait penser que vos données pourraient figurer dans la base de données 1 (en raison du suffixe).

70
Didier Spezia

redis-cli -h KEYS "trendingKey *"

SORTIE 1) "trendingKey: 2: 1" 2) "trending Key: industrie de la tendance102: 1" 3) "trendingKey: fonction de la tendance101: 1"

2
Victor