天天看点

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_;
};