Объедините конвейер Redis-Python с JSON

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

test = "{'key': 'glooler-61245', 'val': 'sighgh'}"
r.json().set("a:glooler-61245", Path.root_path(), ast.literal_eval(test))
rs.search(Query(f"glooler"))

Redis также поддерживает конвейеры, в которых множество вставок могут передаваться одновременно и выполняться в одном большом пакете, например:

pipe = r.pipeline()
pipe.set("a", "a value")
pipe.set("b", "b value")
pipe.execute()
pipe.get("a")

Однако канал позволяет пользователю получать данные только по ключу, в отличие от JSON, где можно получить данные по содержимому. Как я могу объединить эти два, чтобы я мог отправить 10 000 структурированных JSON, как в первом примере, а затем выполнить канал за один раз, а затем иметь возможность получать по значению?

Я попробовал это:

pipe.set('a:glooler-61246', "{'key': 'glooler-61246', 'val': 'loltest'}")
pipe.set('a:glooler-61247', "{'key': 'glooler-61247', 'val': 'loltest2'}")
pipe.set('a:glooler-61248', "{'key': 'glooler-61248', 'val': 'loltest3'}")
pipe.set('a:glooler-61249', "{'key': 'glooler-61249', 'val': 'loltest4'}")
pipe.execute()

Однако rs.search(Query(f"glooler")) по-прежнему возвращает только первое значение, которое я вставил ранее.

эй, подожди, разве в команде set не должно быть просто ключа и значения? Можете ли вы записать набор ключей и значений, которые хотите установить?

anarchy 12.05.2024 15:37
Создание Twitter-подобного приложения Trending Topics App с Redis (на примере PHP)
Создание Twitter-подобного приложения Trending Topics App с Redis (на примере PHP)
Redis - это популярная база данных типа "ключ-значение" в памяти с поддержкой различных типов и структур данных, которая в основном используется для...
1
1
149
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я еще раз посмотрел на ваш вопрос: разве Redis не должен хранить только ключ и значения? Я только что прочитал документацию еще раз.

Разве вы не можете хранить их вот так?

pipe.set('glooler-61246', 'loltest')
pipe.set('glooler-61247', 'loltest2')
pipe.set('glooler-61248', 'loltest3')
pipe.set('glooler-61249', 'loltest4')

pipe.execute()

Зачем вам нужно хранить значение Glooler в ключе и значении?

Возникает ошибка при вызове pipe.execute(): redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a bytes, string, int or float first.

NedStarkOfWinterfell 12.05.2024 11:52

Я еще раз прочитал документацию, можете ли вы сейчас взглянуть на мой ответ? если это не правильно, можете ли вы точно записать набор ключей и значений, которые вы пытаетесь установить?

anarchy 12.05.2024 15:52
Ответ принят как подходящий

Я подозреваю, что ваша проблема в том, что при конвейерной обработке вы вставляете значения в виде обычных строк вместо JSON, поэтому значения ключей не совпадают во время поиска. Попробуй это

pipe = r.pipeline()
pipe.json().set("a:glooler-61246", Path.root_path(), ast.literal_eval("{'key': 'glooler-61246', 'val': 'loltest1'}"))
pipe.json().set("a:glooler-61247", Path.root_path(), ast.literal_eval("{'key': 'glooler-61247', 'val': 'loltest2'}"))
pipe.execute()

Да, это исправило! Не знал о существовании метода json на pipe, не смог найти по нему никакой документации, но это имеет смысл. Большое спасибо!

NedStarkOfWinterfell 17.05.2024 22:22

Другие вопросы по теме