内存淘汰机制 LRU cache

62 篇文章 0 订阅
18 篇文章 2 订阅
本文深入解析了LRU缓存机制的工作原理,包括如何在命中缓存时更新缓存位置,以及如何在缓存未命中时从外部读取数据并放置到缓存的最前端。同时介绍了LRU机制在Redis内存淘汰和关系型数据库减少磁盘IO消耗的应用。
摘要由CSDN通过智能技术生成

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值