Как показать все ключи через redis-cli?


я использую redis в качестве бэкэнда базы данных в памяти для кэша django.

в частности, я использую Джанго-Рэдис настроить следующим образом:

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 кэш, кажется, работает правильно.

странно то, что я не могу видеть ключи кэша django с помощью redis-cli командная строка.

[edit] Пожалуйста, обратите внимание в следующем, что я пробовал оба с

$ redis-cli

и

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

[endedit]

без разницы.

в частности, с помощью :

$ 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:

In [1]: from django.core.cache import cache

In [2]: cache.keys('*')
Out[2]:
[u'django.contrib.sessions.cachebblhwb3chd6ev2bd85bawuz7g6pgaij8',
 u'django.contrib.sessions.cachewpxiheosc8qv5w4v6k3ml8cslcahiwna']

если я использую MONITOR на cli:

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?

2   51   2013-07-09 16:29:11

2 ответа:

Я бы сказал, что есть две возможности:

1 / приложение django может не подключаться к экземпляру Redis, к которому, по вашему мнению, оно подключено, или клиент redis-cli, который вы запускаете, не подключается к тому же экземпляру Redis.

обратите внимание, что вы не используете один и тот же точный механизм подключения в обоих случаях. Django использует сокет домена Unix, в то время как redis-cli использует замыкание на себя TCP (по умолчанию). Вы можете запустить redis-cli, используя тот же путь сокета, чтобы быть конечно:

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

теперь, когда вы проверили с помощью команды монитора, что вы видите команды, отправленные Django, мы можем предположить, что вы подключены к нужному экземпляру.

2 / в Redis существует концепция базы данных. По умолчанию у вас есть 16 различных баз данных, а текущая база данных по умолчанию равна 0. Элемент выберите команда может использоваться для переключения сеанса в другую базу данных. Существует одно пространство ключей для каждой базы данных.

команда 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> keys *
1) "foo"

и теперь в базе данных db1:

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

мое предложение было бы также проверить, отправляет ли приложение Django какую-либо команду SELECT во время подключения к экземпляру Redis (с монитором).

Я не знаком с Django, но то, как вы определили местоположение параметр заставляет меня думать, что ваши данные могут быть в базе данных 1 (из-за суффикса).

redis-cli-H клавиши " trendingKey*"

выход 1) "trendingKey:2:1" 2) " trendingKey: trending102:1" 3)" trendingKey:trending101:1"