2016-08-11 2 views
0

계산 집약적 인 django 응용 프로그램을 개발 중입니다. Celery를 사용하여 작업 수행 시간을 단축하고 Redis를 브로커로 사용하고 캐시를 지원합니다.AWS의 Python 사전을 Redis 캐시에서 읽고 서버를 충돌 함

Redis 캐시는 셀러리 작업 전체에서 큰 사전 구조를 공유하는 데 사용됩니다.

자주 Redis 캐시 (1 초 후)에 파이썬 사전을 작성/업데이트하기위한 나머지 API가 있습니다. 각 api 호출은 새로운 작업을 시작합니다.

localhost에서 모두 잘 작동합니다. 그러나 Aws에서 탄성 빈 줄 응용 프로그램은 언젠가 실행될 때 충돌합니다.

사전 구조가 비어있을 때 충돌이 발생하지 않습니다. 다음은 캐시를 업데이트하는 코드입니다.

r = redis.StrictRedis(host=Constants.REDIS_CACHE_ADDRESS, port=6379, db=0) 
mydict_obj = r.get("mydict") 

if mydict_obj: 

    mydict = eval(str(mydict_obj)) 
else: 
    mydict = {} 


for hash_instance in all_hashes: 

    if hash_instance[1] in mydict: 
     mydict[hash_instance[1]].append((str(hash_instance[0]), str(data.recordId))) 
    else: 
     mydict[hash_instance[1]] = [(str(hash_instance[0]), str(data.recordId))] 


r.set("mydict", mydict) 

해결 방법을 찾을 수 없으므로 왜 탄력있는 콩팥 모양의 응용 프로그램이 aws에서 충돌합니까? 그것은 localhost에서 잘 작동합니다.

+0

elastic-beanstalk 앱에 대한 로그가 있습니까? 예라면 로그 내용을 게시 할 수 있습니까? –

+0

서버가 다운되면 로그가 삭제됩니다. ... : \ –

답변

0

문서에서 :

지정된 바이트 수보다 많은 메모리를 사용하지 마십시오. 메모리 제한에 도달하면 Redis는 선택한 퇴거 정책에 따라 키를 제거하려고 시도합니다 (maxmemory-policy 참조).

레디 스의 정책에 따라 키를 제거 할 수 없습니다, 또는 정책이 세트 'noeviction'에있는 경우, 레디 스 설정처럼, 더 많은 메모리를 사용하는 것이 그 을 명령에 오류 응답을 시작합니다 경우 LPUSH하고, 계속 켜고 을 GET과 같은 읽기 전용 명령에 회신합니다.

이 옵션은 Redis를 LRU 캐시로 사용하거나 인스턴스에 대해 하드 메모리 한계 인 'noeviction'정책을 사용하여 으로 설정할 때 유용합니다.

관련 문제