2013-12-13 3 views
3

외부 서비스의 데이터를 정상적으로 캐싱하고 싶습니다. 만료되었지만 이전 데이터가 작업자가 성공적으로 새 데이터를 가져올 때까지 서비스되고 있습니다. 데이터는 시간에 민감하지 않지만 데이터가 부족 (외부 서비스가 다운 됨)하면 서비스가 실행되지 않으므로 영구 캐시를 사용할 수 있습니다.Python과 Redis를 사용한 우아한 캐싱

현재

  • 나는 노동자가 새로운 (내가 설정하지 않은 만료 시간)

를 가져 때까지 무한정 데이터를 캐시
  • 키 별도의 레디 스에서 타임 스탬프를 가져 오기 저장

    질문

    • Redis에서 올바른 캐싱을 수행하는 올바른 방법입니까?

    • 나는 기본적으로 레디 스의 주요 업데이트 된 타임 스탬프를받을 수, 그래서 나는이 코드 나 자신

    이 정보를 저장할 필요가 없습니다

    def set_data(self, data): 
        self.redis.set("bitcoinaverage", pickle.dumps(data)) 
        self.redis.set("bitcoinaverage_updated", calendar.timegm(datetime.datetime.utcnow().utctimetuple())) 
    
    def get_data(self): 
        return pickle.loads(self.redis.get("bitcoinaverage")) 
    
    def is_up_to_date(self): 
    
        last_updated = datetime.utcfromtimestamp(self.redis.get("bitcoinaverage_updated")) 
    
        if not last_updated: 
         return False 
    
        return datetime.datetime.utcnow() < last_updated + self.refresh_delay 
    
    def tick(self): 
        """ Run a periodical worker task to see if we need to update. 
        """ 
        if not self.is_up_to_date(): 
         self.update() 
    
  • 답변

    2

    당신이 할 수있는 일은 있지만, 데이터를 가져올 것으로 예상되는 정도에 따라 다릅니다. 내가 올바르게 이해한다면 현재 구현은 tick()으로 모든 키를 ping하는 작업자를 실행하도록 요구할 것이다. 이것은 네트워크를 거쳐 Redis에 질의하고 모든 단일 키에 대한 결과를 되돌려 보내야하기 때문에 현재 구현의 네트워크 앞뒤로 매우 비쌉니다. 업데이트). 당신이 언급 한 두 개의 키만있는 것이라면 괜찮습니다. 더 많은 것을위한 것이라면 pipelines are your friend.

    당신이 더 우아하고 견고하기를 원하면 키가 만료되었을 때 notifications을 사용할 수 있습니다. 이 패러다임은 각 값에 대해 kk_updated의 두 가지 키를 설정하는 것입니다. k은 키의 실제 값을 보유하고 k_updatedk을 업데이트하려는 경우 TTL을 설정 한 바보 키일뿐입니다. k_updated이 만료되면 알림을 받게되며 수신 대기자가 즉시이를 새로운 작업에 대한 요청으로 처리하여 k을 업데이트하고 k_updated을 새로 설정할 수 있습니다. 이 모델은 pubsub 모델을 사용할 것이고, 새로운 작업을 관리하기 위해 여러 가입자를 보유하고 대기열을 사용할 수 있습니다.이 시스템의 장점 :

    1. 그들은 끊임없이 업데이트 될 필요가 있는지를 조회 할 필요없이 만료되면 키가 즉시 업데이트 얻을 것이다.

    2. 구독자가 여러 명인 경우 업데이트 작업을 수신하고 새 작업을 관리 할 수 ​​있으므로 하나의 업데이트 작업자가 다운되면 상자를 다시 가져올 때까지 업데이트가 손실되지 않습니다.

    당신은 극단적 인 속도 나 안정성 요구 사항이없는 경우이 후자의 시스템은 사건에 대한 과잉이 될 수 있지만, 당신이 나에 계획하는 경우, 그것은 고려 뭔가.

    +1

    Wooaaah. 레디 스가이 모든 것을 할 수 있다는 것을 나는 몰랐다. 다행히도 단 하나의 프로세스 작업자 만 있지만 복잡한 작업을 할 때이를 명심해야합니다. –

    1

    는 것 확실히하고있는 무엇을 작업.

    키가 삽입/업데이트 된 타임 스탬프를 네이티브 방식으로 얻을 수있는 방법이 없으므로 현재와 같이 또는 비트 저장 키가 저장되는 위치를 변경하여 저장할 수 있습니다. timestamp (예 : 일부 JSON을 사용하여 타임 스탬프와 절인 된 데이터를 모두 저장하고 JSON을 저장) get_data() 및 is_up_to_date()를 더 복잡하게 만듭니다.

    해당 키를 저장하지 않은 경우 get_data() 및 is_up_to_date()는 어떻게됩니까? 그 상태를 테스트 했습니까?

    +0

    고마워요! 현재 누락 된 데이터/타임 스탬프의 초기 조건이 처리되지만 거기에도 추가됩니다. –