Подтвердить что ты не робот

Как показать ВСЕ ключи через redis-cli?

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

В частности, я использую 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 работает корректно.

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

[править] Обратите внимание на следующее, что я попробовал оба с

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

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?

4b9b3361

Ответ 1

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

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

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

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

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

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> 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 (с помощью MONITOR).

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

Ответ 2

redis-cli -h KEYS "trendingKey *"

ВЫВОД 1) "trendingKey: 2: 1" 2) "trendingKey: trending102: 1" 3) "trendingKey: trending101:1"