2013-07-09 58 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」