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")) по-прежнему возвращает только первое значение, которое я вставил ранее.

Я еще раз посмотрел на ваш вопрос: разве 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.
Я еще раз прочитал документацию, можете ли вы сейчас взглянуть на мой ответ? если это не правильно, можете ли вы точно записать набор ключей и значений, которые вы пытаетесь установить?
Я подозреваю, что ваша проблема в том, что при конвейерной обработке вы вставляете значения в виде обычных строк вместо 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, не смог найти по нему никакой документации, но это имеет смысл. Большое спасибо!
эй, подожди, разве в команде set не должно быть просто ключа и значения? Можете ли вы записать набор ключей и значений, которые хотите установить?