Значения Redis, установленные из Python, не отражаются в клиенте Redis

Я установил redis на свою OS X и пытаюсь установить и получить некоторые значения в Redis из клиента Python 3.5. У меня включен сервер Redis (с помощью команды redis-server) и клиент redis (открыт с помощью команды redis-cli). Это то, что я пытаюсь использовать на Python:

import redis
r = redis.StrictRedis()
r.set("foo", "bar")
r.get("foo")

Это печатает bar, как и ожидалось. Однако, если я перейду к командной строке Redis-клиента и попробую get foo, он вернет nil. Точно так же, если я устанавливаю значение в самом redis-клиенте, например set boo too, вызов get boo в клиенте возвращает too, как и ожидалось, однако в моем клиенте Python, если я запускаю r.get(boo), я получаю None.

Забавно то, что они синхронизируются между своими экземплярами. Поэтому, если я открою другую командную строку Python и наберу r.get("foo"), она вернет bar. Таким же образом, если я открою другой экземпляр redis-cli и наберу get boo, я получу too. Только значения между клиентом Python и клиентом Redis не синхронизируются. Я даже пытался применить bgsave из клиента Python после установки значения там, и это вызвало сохранение в окне, где работает redis-server, но значения не отражаются в окне redis-cli даже после этого.

Они работали отлично, пока несколько дней назад это не начало происходить недавно.

Есть идеи, как это исправить?


person SexyBeast    schedule 21.11.2018    source источник
comment
Очевидно, вы не подключаетесь к одному и тому же серверу redis из кода clis и python...   -  person Itamar Haber    schedule 21.11.2018
comment
Я догадывался, но не могу понять, как подключить оба к одному экземпляру, и почему это вдруг начало происходить!   -  person SexyBeast    schedule 21.11.2018


Ответы (1)


Мне кажется, что вы обращаетесь (устанавливаете/получаете значения) через разные db в своем экземпляре redis-cli и redis-py. redis серверы могут иметь несколько хранилищ пар "ключ-значение" (или "таблиц"), полностью изолированных друг от друга. Они упоминаются в документации как db и однозначно идентифицируются целыми числами.

Если вы создаете экземпляр redis-py точно так же, как в своем фрагменте кода, с помощью:

import redis
r = redis.StrictRedis()

Затем вы используете значение конструктора по умолчанию для db, равное 0. (см. документацию)

Если значения различаются между реализацией Python и redis-cli, то, скорее всего, ваш клиент командной строки работает на другом db, чем 0. Вы можете проверить, над каким db вы работаете, с помощью команды СПИСОК КЛИЕНТОВ, который вернет ваш текущий идентификатор базы данных.

Чтобы переключиться на ту же базу данных, что и реализация Python, просто запустите на своем redis-cli:

SELECT 0

(см. документацию)

Или, как вариант, вы можете вызвать конструктор redis-py с нужным параметром db:

r = redis.StrictRedis(db=3) # 3 is an example value for your redis-cli's working db
person felipecgonc    schedule 21.11.2018
comment
Спасибо. Я создал его со значением db равным 3 в Python, а также установил его в Redis: SELECT 3. Выход: 127.0.0.1:6379[3]> get foo (nil) - person SexyBeast; 21.11.2018
comment
@SexyBeast значение вашей базы данных redis-py было определенно равно 0, тогда как вы не знаете, какую базу данных использовал ваш redis-cli, поэтому вы не можете ожидать, что сможете получить то же значение со 100% уверенностью. . Попробуйте запустить SELECT 0, а затем GET foo в redis-cli - person felipecgonc; 21.11.2018
comment
Вот что я сказал, я попытался установить его на 3 в обоих случаях, а затем запустил команды. Все равно не в раздумьях.. - person SexyBeast; 21.11.2018
comment
@SexyBeast, но вы также запускали SET foo bar (в любом из клиентов) после установки для обеих баз данных значения 3? - person felipecgonc; 21.11.2018
comment
да. Сделал это. И до сих пор не размышляет! :( - person SexyBeast; 21.11.2018
comment
Пожалуйста, попробуйте FastoRedis, так будет проще найти проблему, которая у вас есть. - person Topilski Alexandr; 25.11.2018