Cache满载的LRU置换

梦想游戏人
目录:
C/C++

用LRU置换原则来解决 缓存满载问题

以下是一个实现,还可以进一步优化,在此不在阐述

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
using namespace std;




class Node
{
public:
	string _data;
	string _key;
	Node(string key, string data)
	{
		this->_data = data;
		this->_key = key;
	}
	void release(){ delete this; }
	Node(){}
};




/*
LRU = Least Recently Used的缩写,即最近最少使用的操作系统内存页面置换算法,利用该思想设计一个缓存

如果缓存满载后,把最近最少使用的从缓存中移除

基本思想:
用链表来维护,每次使用一个 缓存数据时吧该节点放到链表头部,
链表头到尾使用顺序依次递减,所以链表尾部是当前整个链表最少使用的。
利用链表的顺序来标记,使用情况,避免了用诸如使用时间来标记,性能大大提升。

添加缓存:吧添加的放到链表尾部,维护当前队列大小,如果满载,那么移除最少使用的
返回缓存:负责吧目标数据移到链表头部,表示当前使用的,

*/

#define  MAX_SIZE  3

class LRU_Cache
{

public:

	Node*getValue(const string & key)
	{

		Node* target = nullptr;

		// 查找,目标Node
		auto iter = this->_list.begin();

		while (iter != this->_list.end())
		{

			if ((*iter)->_key == key)
			{//查找成功,从链表中移除,然后添加到头部
				target = *iter;
				this->_list.erase(iter);
				_list.push_front(target);
				return target;
				break;

			}
			iter++;
		}

		return nullptr;

	}

	void addValue(const string & key, string data)
	{

		auto iter = this->_list.begin();

		while (iter != this->_list.end())
		{
			if ((*iter)->_key == key)
			{//已经存在
				return;

			}
			iter++;
		}

		if (this->_curr_size == MAX_SIZE)
		{
			//满载 ,移除最近最少使用 (链表尾部)
			this->_curr_size--;
			this->_list.remove(_list.back());
		}

		_list.push_front(new Node(key, data));
		this->_curr_size++;
		cout << __FUNCTION__ << "Curr Size" << _curr_size << endl;
	}

	void print()
	{
		auto iter = this->_list.begin();


		while (iter != this->_list.end())
		{

			cout << "Key:" << (*iter)->_key << "  Value:" << (*iter)->_data << endl;
			iter++;
		}


	}

	std::list <Node*> _list;

	unsigned int _curr_size = 0;

};




int main()
{
	LRU_Cache*cache = new LRU_Cache;
	cache->addValue("111111", "data");
	cache->addValue("22222", "data");
	cache->addValue("333333", "data");



	cache->getValue("333333");

	cache->addValue("444444", "data");


	cout << cache->_curr_size;
	cache->print();



	system("pause");
	return 0;
}
Scroll Up