天天看點

leveldb學習筆記之九——include/leveldb/cache.h

cache建立了一個給定尺寸的緩存,該緩存使用最近最少使用的逐出原則。

源碼如下:

class LEVELDB_EXPORT Cache {
public:
    Cache() = default;              //設定預設構造函數

    Cache(const Cache&) = delete;         //禁止拷貝構造
    Cache& operator=(const Cache&) = delete;  //禁止指派操作符

    // 析構函數
    virtual ~Cache();

    // 緩沖中存儲的項的不透明句柄
    struct Handle { };

    //插入一個從key->value的映射到cache中,并為其配置設定空間,傳回是對應映射的句柄。
    //當不使用時,需要調用this->Release(handle)釋放句柄
    virtual Handle* Insert(const Slice& key, void* value, size_t charge,
                         void (*deleter)(const Slice& key, void* value)) = 0;

  // 查找key對應的映射,如果沒有找到傳回nullptr。
  // 當不使用時,同樣需要調用this->Release(handle)釋放句柄
  virtual Handle* Lookup(const Slice& key) = 0;

  // 釋放句柄函數
  virtual void Release(Handle* handle) = 0;

  // 傳回映射句柄對應的value值
  virtual void* Value(Handle* handle) = 0;

  // 如果緩沖中包含key對應的映射,則将其清除。
  // 值得注意的,在釋放handle之前,底層将一直保留該條目
  virtual void Erase(const Slice& key) = 0;

  // 傳回一個數字id,可能有多個用戶端共享相同的cache來風格key的空間
  virtual uint64_t NewId() = 0;

  // 删除所有未在使用中的緩存項,記憶體使用受限的應用程式可能希望調用此方法以減少記憶體的使用量。
  // prune()的預設實作是不起任何作用。
  virtual void Prune() {}

  // 傳回緩存中存儲的所有元素的組合的空間估計。
  virtual size_t TotalCharge() const = 0;

 private:
  void LRU_Remove(Handle* e);
  void LRU_Append(Handle* e);
  void Unref(Handle* e);

  struct Rep;
  Rep* rep_;
};