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