2016-11-21 5 views
0

Я работаю над флеш-приложением, которое взаимодействует с redis. Это приложение развертывается на герою, добавив redis.redis get function return None

Когда я выполняю некоторые испытания с помощью взаимодействия, я не могу получить пару ключевых значений, которые я только что установил. Вместо этого я всегда получаю 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, он тоже работает.

тестирование с питона оболочки:

heroku run python 
from server import redis 
redis.set('test', 'i am here') # return True 
redis.get('test') # return i am here 

я теперь запутался. Как правильно взаимодействовать с redis с помощью Flask?

ответ

0

Я сделал больше экспериментов по этому вопросу. Кажется, есть проблема, связанная с задержкой. нижеуказанная модификация заставит его работать:

@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, кажется, однопоточный. Поэтому я не уверен, почему он выполнит вызов функции функции перед выполнением заданной функции. Кто-то, у кого больше опыта, напишите объяснение.

1

Redis-py по умолчанию создает клиент ConnectionPool, и это, вероятно, то, что делает вспомогательная функция from_url. Хотя сам Redis является однопоточным, команды из пула соединений не имеют гарантированного порядка выполнения. Для одного клиента создайте непосредственно клиента redis.StrictRedis или пройдите через параметр connection_pool=none. Это предпочтительнее для простых команд с низким номером, поскольку накладные расходы на подключение меньше. Вы также можете использовать конвейер в контексте пула соединений для сериализации пакетной операции.

https://redis-py.readthedocs.io/en/latest/#redis.ConnectionPool

https://redis-py.readthedocs.io/en/latest/#redis.Redis.pipeline