2013-07-09 60 views
50

我使用redis作为django缓存的内存数据库后端。如何通过redis-cli显示所有密钥?

特别是,我使用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 

[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" 

而从运行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缓存前缀;这应该证明redis-cli连接到相同的服务。 但是,即使搜索在redis-cli前缀返回(empty list or set)

这是为什么?

在同一个redis实例上划分不同缓存的机制是什么?

+0

一些关于redis-cli命令和参数用于回复疑问的评论 – Stefano

回答

65

我会说有两种可能性:

1/Django的应用程序可能无法连接到你认为它是连接,或在启动Redis的-CLI客户端不连接到相同的Redis的实例Redis实例。

请注意,在两种情况下都不要使用相同的确切连接机制。 Django使用Unix域套接字,而redis-cli使用TCP环回(默认情况下)。您可能需要使用相同的插座路径推出Redis的CLI,可以肯定的:

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

现在既然你与你看到的Django发送的命令的MONITOR命令验证,我们可以假设你连接到正确的实例。

2/Redis中有一个数据库概念。默认情况下,您有16个不同的数据库,并且当前的默认数据库为0.可以使用SELECT命令将会话切换到另一个数据库。每个数据库有一个密钥空间。

INFO KEYSPACE命令可用于检查某些键是否在多个数据库中定义。

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

在这里,我有两个数据库,让我们检查在DB0数据库中定义的键:

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

我的建议是也:

redis 127.0.0.1:6379> keys * 
1) "foo" 
在DB1数据库

现在检查Django应用程序是否在连接时向Redis实例(使用MONITOR)发送任何SELECT命令。

我对Django并不熟悉,但您定义LOCATION参数的方式让我觉得您的数据可能在数据库1中(由于后缀)。

+1

感谢Didier。我已经排除了1),因为我也尝试直接连接到套接字,我没有看到任何区别。但我不知道“SELECT”命令!完全是这样!现在工作......我必须说Redis文档在这一点上并不十分清楚。即使检查[Redis SELECT](http://redis.io/commands/select)命令doc也会显示一堆混淆的注释! – Stefano

+0

在您的答案中添加了“SELECT”命令文档的链接,但我无法找到对多个数据库的任何官方参考。也许这只是我,如果你知道它可以请你添加链接?谢谢! – Stefano

+1

恐怕没有描述数据库的专用页面。尽管在配置文件中有一个有用的注释:https://github.com/antirez/redis/blob/unstable/redis.conf#L86 –

2

redis的-CLI -h KEYS “trendingKey *”

OUTPUT 1) “trendingKey:2:1” 2) “trendingKey:trending102:1” 3) “trendingKey:trending101:1”