redis get function return None
Я работаю над приложением колбы, которое взаимодействует с Redis. Это приложение развернуто на героку, с добавлением Redis.
Когда я провожу некоторое тестирование взаимодействия, я не могу получить пару ключ-значение, которую я только что установил. Вместо этого я всегда получаю None в качестве типа возврата. Вот пример:
import Flask
import redis
app = Flask(__name__)
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
redis = redis.from_url(redis_url)
@app.route('/test')
def test():
redis.set("test", "{test1: test}")
print redis.get("test") # print None here
return "what the freak"
if __name__ == "__main__":
app.run(host='0.0.0.0')
Как показано выше, тестовый маршрут будет печатать None, это означает, что значение не установлено. Я сбит с толку. Когда я тестирую сервер в локальном браузере, он работает, и когда я пытался взаимодействовать с redis с помощью оболочки python heroku, это тоже работает.
тестирование с использованием оболочки Python:
heroku run python
from server import redis
redis.set('test', 'i am here') # return True
redis.get('test') # return i am here
Я сейчас в замешательстве. Как правильно взаимодействовать с Redis с помощью Flask?
2 ответа
Redis-py по умолчанию создает ConnectionPool
клиент, и это, вероятно, что from_url
вспомогательная функция делает. Хотя сам Redis является однопоточным, команды из пула соединений не имеют гарантированного порядка выполнения. Для одного клиента создайте redis.StrictRedis
клиент или напрямую через параметр connection_pool=none
, Это предпочтительнее для простых команд с небольшим числом, так как меньше накладных расходов на управление соединением. В качестве альтернативы вы можете использовать конвейер в контексте пула соединений для сериализации пакетной операции.
Я сделал больше экспериментов на этом. Кажется, есть проблема, связанная с задержкой. приведенная ниже модификация заставит его работать:
@app.route('/test')
def test():
redis.set("test", "{test1: test}")
time.sleep(5) # add the delay needed to the let the set finish
print redis.get("test") # print "{test1: test}" here
return "now it works"
Я прочитал документацию по Redis, Redis кажется однопоточным. Поэтому я не уверен, почему он выполнит вызов функции get до того, как будет выполнена функция set. Кто-то с большим опытом, пожалуйста, отправьте объяснение.