2013-04-17 1 views
1
void onAdd(const void*, const KeyValueArgs <TKey, TValue>& args) 
{ 
    _keys.push_front(args.key()); 
    std::pair<IndexIterator, bool> stat = _keyIndex.insert(std::make_pair(args.key(), _keys.begin())); 
    if (!stat.second) 
    { 
     stat.first->second = _keys.begin(); 
    } 
} 

누군가이 코드의 작동 방식을 설명해 주시겠습니까? 그것은 POCO LRUCacheStrategy에서 왔으며 LRUCache 구현을위한 맵을 사용합니다.Poco의 LRUCacheStrategy - 어떻게 작동합니까?

캐시 된 개체를 디스크에 저장하려면 캐시를 변경하고 싶습니다. 닫는 즉시 파일 스트림을 전략에 추가 할 수 있습니까?

도움 주셔서 감사합니다.

답변

1

this과 같은 것을 사용하여 캐시 맵을 직렬화하고 fstream을 사용하여 저장/읽기하십시오.

1

우리의 디스크에 캐시 된 개체를 저장하는 캐시를 변경하려면 가까운

가 명시 적으로 캐시 close()를 (그리고, 결과적으로, 어떤 전략으로 onClose()) 호출은 없지만 (아래 참조) 쉽게 소멸자의 지속성을 자동화 할 수 있습니다 (중요 : 소멸자가 이스케이프되지 않도록 예외가 발생하지 않도록하십시오). (보호) 회원 (제공 프레임 워크 (시작하면 훨씬 더 좋을) 및 최종 것 정도 "더러운"입니다

template < 
    class TKey, 
    class TValue, 
    class TMutex = FastMutex, 
    class TEventMutex = FastMutex 
> 
class PersistentLRUCache: public Poco::AbstractCache<TKey, TValue, LRUStrategy<TKey, TValue>, TMutex, TEventMutex> 
{ 
public: 
    // ... 

    ~PersistentLRUCache() 
    { 
      try { 
        Iterator it = _data.begin(); 
        Iterator end = _data.end(); 
        for (; it != end; ++it) 
        { 
         // write entries to file 
        } 
      } catch (...) { /* log errors */} 
    } 

    // ... 
}; 

액세스 부모 클래스 :

자신의 캐시가 간단 정의, 여기에 수정 소멸자와 LRUCache입니다()는 기본 컨테이너에 액세서, 좋든 나쁘 든, 그것은 허용 당신은 그것을 활용할 수 있습니다

은 우리가 전략에 어떤 파일 스트림을 추가 할 수 있습니다

.?

프레임 워크 클래스에 직접 기능을 추가하면 모든 새 릴리스에서 변경 사항을 덮어 쓰므로 변경 사항을 다시 적용해야합니다. 위에서 보인 것처럼 자신의 캐시를 정의하는 것이 낫습니다. 그러면 프레임 워크 변경으로 인해 기능을 덮어 쓰지 않아도됩니다.

+0

걸릴 _ 데이터는 키와 값이 포함 된지도입니까? –

+0

_data는 부모 클래스의 보호 된 멤버 인 [AbstractCache :: _ data] (https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/AbstractCache.h#L369)입니다. – Alex