内存淘汰机制 LRU cache

LRU cache机制的目的是为了减少频繁查找的开销,包括磁盘IO等。

(1)、如果LRU中存在则从LRU缓存中查找,查找到了之后放到容器(list)的最前面

(2)、如果缓存中没有,则从其地方(数据库、磁盘、文件)中读取,读取之后放到容器的最前面

(3)、用户设定缓存的大小

例如:

redis使用LRU机制来做内存淘汰机制

其他关系型数据库使用LRU减少磁盘IO的消耗

template <typename key_t, typename value_t>
class LRU {
public:
    typedef typename std::pair<key_t, value_t> key_value_t;
    typedef typename std::list<key_value_t>::iterator list_it_;
    
    explicit LRU(size_t size) : max_size_(size) {}
    ~LRU() {}
    
    void put(const key_t& key, const value_t& value) {
        auto it = map_.find(key);
        if (it != map_.end()) {
            auto iter = map_[key];
            iter->second = value;
            list_.splice(list_.begin(), list_, iter);
        } else {
            if (list_.size() >= max_size_) {
                map_.erase(list_.back().first);
                list_.pop_back();
            }
            
            list_.push_front(key_value_t(key, value));
            map_[key] = list_.front();
        }
    }
    
    bool get(const key_t& key, value_t& value) {
        auto it = map_.find(key);
        if (it == map.end()) {
            return false;
        } else {
            value = it->second->second;
            list_.splice(list_.begin(), list_, it->second);
        }
    }
    
    size_t size() const {
        return map_.size();
    }

private:
    boost::unordered_map<key_t, list_it_> map_;
    size_t size_;
    std::list<key_value_t> list_;
};
发布了199 篇原创文章 · 获赞 149 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/zgaoq/article/details/103540609
今日推荐