Como mostrar todas as chaves através de redis-cli?

Estou a usar o redis como base de dados de memória para o cache django.

em particular, Uso o django-redis configurado do seguinte modo:

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',
        },
    },
}
O meu cache django parece funcionar correctamente.

O mais estranho é que não consigo ver as chaves do cache do django usando a linha de comandos.

[editar] Por favor, note no seguinte que eu tentei ambos com

$ redis-cli

e

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

[endedit]

sem nenhuma diferenca.

em particular, usando o comando KEYS *:

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

Mas

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

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']

Se estou a usar MONITOR no cli:

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

consigo ver um pedido, usando o prefixo do cache django; que deve provar que o redis-cli Está ligado ao mesmo serviço. Mas mesmo à procura desse prefixo no redis-cli devolve um (empty list or set)

porquê?

quais são os mecanismos que compartimentalizam o esconderijos diferentes no mesmo caso redis?

Author: Stefano, 2013-07-09

2 answers

Eu diria que há duas possibilidades:

1/ a aplicação django pode não se ligar à instância Redis a que pensa que está ligada, ou o cliente redis-cli que lança não se liga à mesma instância Redis.

Por favor, note que não utiliza o mesmo mecanismo de ligação exacto em ambos os casos. Django usa um soquete de domínio Unix, enquanto redis-cli usa o loopback TCP (por padrão). Poderá querer lançar o redis-cli usando a mesma localização do 'socket', para ter a certeza:

$ redis-cli -s /tmp/redis_6379.sock
Agora uma vez que você verificou com um comando de MONITOR que você vê os comandos enviados por Django, podemos assumir que você está conectado à instância certa.

2 / Existe um conceito de base de dados em Redis. Por padrão, você tem 16 bases de dados distintas, e a base de dados padrão atual é 0. O comando SELECT pode ser usado para mudar uma sessão para outra base de dados. Existe um espaço de chave por base de dados.

O comando INFO KEYSPACE pode ser usado para verificar se algumas chaves estão definidas em várias banco.

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

Aqui tenho duas bases de dados, vamos verificar as chaves definidas na base de dados db0:

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

E agora na base de dados db1:

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

A minha sugestão seria também verificar se a aplicação Django envia algum comando SELECT no momento da ligação à instância Redis (com MONITOR).

Não estou familiarizado com o Django, mas a forma como definiu o parâmetro de localização faz-me pensar que os seus dados podem estar na base de dados 1 (devido ao sufixo).

 68
Author: Didier Spezia, 2013-07-10 07:59:20

Redis-cli-h KEYS "trendingKey*"

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

 2
Author: Victor, 2016-08-01 06:19:42