Como mostrar todas as chaves através de redis-cli?
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?
2 answers
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).
Redis-cli-h KEYS "trendingKey*"
Resultado 1) "trendingKey: 2: 1" 2) "trendingKey: trending102: 1" 3) "trendingKey: trending101: 1"