2011-02-17 4 views
1

내 시스템에는 짧은 수명의 데이터가 있습니다. 이는 데이터가 오래 동안 작동하지만 데이터 저장소에서 지속될 수 있음을 의미합니다. 또한이 데이터는 각 사용자 (예 : 매분)마다 자주 변경 될 수 있습니다. 잠재적으로 사용자의 양이 충분히 클 수 있으며 memcache를 사용하고 bigtable에 지연 지속을 사용하여이 데이터의 put/get 프로세스의 속도를 높이고 싶습니다.Google App Engine + Memcache 캐시에서 모든 데이터를 가져 오는 방법

키로 개체를 넣거나 가져 오는 데 아무런 문제가 없습니다. 그러나 일부 사용 사례의 경우 캐시에서 모든 데이터를 검색해야하지만 아직 API 만 있으면 데이터를 키로 가져올 수 있습니다. 따라서 memcache 내부의 모든 데이터 키를 알고있는 키 홀더가 있어야합니다. 그러나 모든 개체가 축출 될 수 있으며 키의 글로벌 레지스트리에서이 키를 제거해야합니다 (그러나 그러한 수신기는 GAE에서 작동하지 않습니다). 목록에있는 모든 개체를 저장하려면 내 솔루션에 대해지도를 가져올 수 없습니다. 각 개체마다 퇴출 할 시간이 있어야하기 때문입니다 ...

누군가가 이동해야하는 방식으로 나를 추천 할 수 있습니까?

답변

2

실제로 시도하고있는 것처럼 들리는 데이터에 대한 대기열이 있습니다. 당신이 말했듯이, Memcache는 신뢰할만한 것이 아니기 때문에 좋은 선택이 아닙니다. 아마도 Task Queues을 사용하는 것이 더 나을 것입니까?

+0

아니요, 이것은 절대적으로 다른 것입니다. 다른 목적으로 작업 대기열을 사용하고 있습니다. 정확하게 캐시가 필요합니다. – endryha

0

Memcache는 철저한 액세스를 위해 설계되지 않았으므로 필요한 경우 잘못된 방식으로 사용하고있을 수 있습니다. Memcache는 해시 된 해시 테이블이므로 실제로 열거하도록 설계되지 않았습니다.

정확하게 무엇을 하려는지 명확하지 않지만, 적어도 데이터를 재구성해야 원하는 키를 쓸 수있는 시점에 알 수 있습니다. 데이터 저장소.

0

데코레이터 기능을 구축하여 해결할 수있는 동일한 문제가 발생하여 엔터티에 대한 키가 Memcache의 키 디렉토리/자리 표시 자에서 자동으로 삭제되도록 즉, 전화 할 때 퇴거를 위해. 이 같은

뭔가 :

def decorate_evict_decorator(key_prefix): 

    def evict_decorator(evict):   
     def wrapper(self,entity_name_or_id):#use self if the function is bound to a class. 
      mem=memcache.Client() 
      placeholder=mem.get("placeholder")#could use gets with cas 
      #{"placeholder":{key_prefix+"|"+entity_name:key_or_id}} 
      evict(self,entity_name_or_id) 
      del placeholder[key_prefix+"|"+entity_name] 
      mem.set("placeholder",placeholder) 
     return wrapper 
    return evict_decorator 


class car(db.Model): 
    car_model=db.StringProperty(required=True) 
    company=db.StringProperty(required=True) 
    color=db.StringProperty(required=True) 
    engine=db.StringProperty() 

    @classmethod 
    @decorate_evict_decorator("car") 
    evict(car_model): 
     #delete process 

class engine(db.Model): 
    model=db.StringProperty(required=True) 
    cylinders=db.IntegerProperty(required=True) 
    litres=db.FloatProperty(required=True) 
    manufacturer=db.StringProperty(required=True) 

    @classmethod 
    @decorate_evict_decorator("engine") 
    evict(engine_model): 
     #delete process 

당신은 당신의 데이터 구조와 흐름에 따라이를 개선 할 수있다. 그리고 for more on decorators.

정기적으로 memcache와 데이터 저장소를 동기화하려면 cron을 추가 할 수 있습니다.