跳转至

3. LruCache

使用下述功能需要包含头文件coke/lru_cache.h

coke::LruCache

coke::LruCache是一个基于LRU淘汰策略的并发安全的缓存容器,支持异步等待缓存就绪。适用于需要缓存热点数据且需要协调多个协程访问同一资源的场景。

template<typename Key, typename Value, typename Compare = std::less<>>
class LruCache;

LruCache::HandleLruHandle<Key, Value>的别名。

成员函数

  • 构造函数

    创建指定容量和比较器的coke::LruCache。默认使用std::less<>比较键。当max_size为0时,表示容量无限制。

    coke::LruCache不可移动、不可复制。

    explicit LruCache(SizeType max_size);
    LruCache(SizeType max_size, const Compare &cmp);
    
  • 析构函数

    销毁LruCache,应保证所有通过get_or_create返回的句柄都不再处于等待状态。

    ~LruCache();
    
  • 容量查询

    SizeType size() const;    // 当前缓存条目数
    SizeType capacity() const; // 最大容量
    
  • 获取条目

    通过键查找条目,返回空句柄表示未命中。命中时会自动将key升热。

    template<typename U>
    Handle get(const U &key);
    
  • 获取或创建条目

    返回(handle, created)对。当createdtrue时,调用者应负责填充值并唤醒等待者。

    template<typename U>
    std::pair<Handle, bool> get_or_create(const U &key);
    
  • 插入条目

    直接插入条目,使用args...构造value,并返回对应句柄。

    template<typename U, typename... Args>
    Handle put(const U &key, Args &&... args);
    
  • 删除条目

    支持通过键或句柄删除。条目会立即被移除,但已有句柄仍可访问已存在的值。

    template<typename U>
    void remove(const U &key);
    
    void remove(const Handle &handle);
    
  • 清空缓存

    void clear();
    

coke::LruHandle

  • 构造/赋值/析构函数

    // 创建一个空句柄,不关联任何条目。
    LruHandle();
    
    // 复制构造,创建一个新的句柄,关联同一个条目。
    LruHandle(const LruHandle &);
    
    // 移动构造
    LruHandle(LruHandle &&);
    
    // 复制赋值,关联同一个条目。
    LruHandle &operator=(const LruHandle &);
    
    // 移动赋值
    LruHandle &operator=(LruHandle &&);
    
    // 析构函数,自动释放关联的条目。
    ~LruHandle();
    
  • 状态检查

    // 是否关联条目
    operator bool() const;
    
    // 是否正在等待值
    bool waiting() const;
    
    // 是否成功设置值
    bool success() const;
    
    // 是否标记为失败
    bool failed() const;
    
  • 值操作

    填充值或标记失败状态后,均需要调用notify_one/notify_all唤醒等待者。

    // 原地构造值
    void emplace_value(Args&&... args);
    
    // 通过回调函数设置值
    void create_value(ValueCreater &&cb);
    
    // 标记为失败状态
    void set_failed();
    
  • 异步等待

    协程返回一个int类型整数,有以下几种情况

    • coke::TOP_SUCCESS表示成功取出
    • coke::TOP_TIMEOUT表示等待超时,wait_for可能返回该值
    • coke::TOP_ABORTED表示进程正在退出
    • coke::TOP_CLOSED表示容器为空且已被关闭
    • 负数表示发生系统错误,该情况几乎不会发生
    // 等待至状态变化
    coke::Task<int> wait();
    
    // 带超时的等待
    coke::Task<int> wait_for(coke::NanoSec nsec);
    
  • 唤醒机制

    // 唤醒单个等待协程
    void notify_one();
    
    // 唤醒所有等待协程
    void notify_all();
    
  • 获取值

    // 获取key
    const Key &key() const;
    
    // 获取value,要求此时处于成功状态
    const Value &value() const;
    
    // 获取可修改的value,要求此时处于成功状态,使用者保证修改是线程安全的
    Value &mutable_value();
    

示例

参考example/ex018-lru_cache.cpp