2012-10-19 3 views
35

파이썬 응용 프로그램에서 Python 응용 프로그램에 redis-py을 사용하여 간단한 변수 또는 변수 목록을 Redis 데이터베이스에 저장하므로 필요할 때마다 redis 서버에 연결하는 것이 더 좋을 것이라고 생각했습니다. 매우 자주 수행되지는 않으며 변수가 시간 초과 될 수있는 영구 연결을 원하지 않기 때문에 변수를 저장하거나 검색하십시오.Python에서 redis 연결 관리

일부 기본 자습서를 통해 읽은 Redis 클래스를 사용하여 연결을 만들었지 만 연결을 닫는 방법을 찾지 못했습니다. Redis를 처음 사용하기 때문에 연결을 닫지 않았습니다. 연결 관리를위한 최선의 방법을 사용하고 있는지 확실하지 않으므로 이에 대한 조언이 필요합니다. 이다 나는 set 팅 또는 get 팅 이제 변수 해요 방법 : 기본적으로 내가 마지막 접속 시간을 저장하기 위해이 코드를 사용하거나 내 응용 프로그램 및 물건 등을 수행 초당 요청의 평균을 얻기 위해

import redis 

def getVariable(variable_name): 
    my_server = redis.Redis("10.0.0.1") 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis("10.0.0.1") 
    my_server.set(variable_name, variable_value) 

그.

귀하의 조언에 감사드립니다.

답변

54

파이썬은 객체를 처리하기 위해 참조 카운터 메커니즘을 사용하므로 블록의 끝에 my_server 객체가 자동으로 삭제되고 연결이 닫힙니다. 명시 적으로 닫을 필요는 없습니다.

이제는 Redis 연결을 관리하는 방법이 아닙니다. 각 작업에 대한 연결/분리는 너무 비싸므로 연결을 유지하는 것이 훨씬 좋습니다.

import redis 

POOL = redis.ConnectionPool(host='10.0.0.1', port=6379, db=0) 

def getVariable(variable_name): 
    my_server = redis.Redis(connection_pool=POOL) 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis(connection_pool=POOL) 
    my_server.set(variable_name, variable_value) 

있습니다 연결 풀 관리는 대부분 자동으로 이루어 레디 스 - 평 내에서 수행 : 레디 스-PY로는 연결 풀을 선언하여 수행 할 수 있습니다.

+0

덕분에 나는 그것에 대해 안다.하지만 만약 내가 연결 풀을 만들면 나는이 모듈을 벗어나거나 그것이 필요하지 않을 때 어떤 식 으로든 그것을 닫을 수있는 방법을 가지고 있는가? – jeruki

+2

필요 없음. 파이썬은 POOL 객체에 대한 마지막 참조가 파괴 될 때 연결을 닫습니다 (여기서는 스크립트의 끝 부분에서). –

+0

고마워요. 내가 아는 데 필요한 모든 것. – jeruki

2

@ sg1990 동시에 redis를 요구하는 10.000 명의 사용자가 있다면 어떻게해야합니까? 단일 연결을 공유 할 수 없으며 병목 현상을 일으켰습니다.

연결 풀을 사용하면 임의의 연결 수를 만들고 get_connection()release(), redis-py docs을 사용하면됩니다.

모든 연결이 열린 소켓을 유지해야하기 때문에 사용자 당 연결은 엄청난 과잉입니다. 이렇게하면 예를 들어 귀하의 기계가 절반으로 처리 할 수있는 동시 websocket 사용자.

+0

AFAIK 연결 풀은 명시 적으로 지정하거나 지정하지 않으면 자동으로 만들어집니다.근원 https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493에서 볼 수있는 내용이 사실입니다. –