2016-11-21 1 views
0

redis와 상호 작용하는 플라스크 응용 프로그램을 작성 중입니다. 이 응용 프로그램은 heroku에 배포되고 redis가 추가됩니다.redis get 함수 반환 없음

상호 작용에 대한 테스트를 수행 할 때 방금 설정 한 키 값 쌍을 가져올 수 없습니다. 대신 반환 유형으로 항상 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') 

위와 같이 테스트 경로에는 아무 것도 표시되지 않습니다. 값이 설정되어 있지 않습니다. 나는 혼란 스럽다. 로컬 브라우저에서 서버를 테스트 할 때 작동하며 heroku python 셸을 사용하여 redis와 상호 작용을 시도했을 때도 제대로 작동합니다.

파이썬 쉘 테스트 :

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

지금 혼란 스러워요. Flask를 사용하여 redis와 올바르게 상호 작용해야합니까?

답변

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는 하나의 스레드로 보입니다. 따라서 set 함수가 완료되기 전에 get 함수 호출을 실행하는 이유는 확실하지 않습니다. 경험이 많은 분은 설명을 올리십시오.

1

Redis-py는 기본적으로 ConnectionPool 클라이언트를 구성합니다. 이는 아마도 from_url 도우미 기능이 수행하는 것일 것입니다. Redis 자체는 단일 스레드이지만 연결 풀의 명령에는 보장 된 실행 순서가 없습니다. 단일 클라이언트의 경우 redis.StrictRedis 클라이언트를 직접 구성하거나 connection_pool=none 매개 변수를 전달하십시오. 이것은 적은 수의 연결 관리 오버 헤드가 있으므로 간단한 명령에 적합합니다 (숫자가 적음). 또는 연결 풀의 컨텍스트에서 파이프 라인을 사용하여 일괄 작업을 serialize 할 수 있습니다.

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

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