最近最少使用缓存算法LRU
来源:互联网 发布:sql数据库是基于 编辑:程序博客网 时间:2024/05/22 13:02
一:应用背景
分布式系统中的计算节点的输入参数是大量重复的文件,这些文件通常在10M-300M之间,如果每次从磁盘读取将会在读取数据上耗费大量的时间。解决这个问题解决方案的一个方法就是设计一个缓存机制,在内存中保存最近使用的文件,下次计算任务到来先检查缓存是否有此文件,有则直接读取缓存,而没必要读取磁盘文件!
二:LRU最近最少使用缓存算法
该算法的实现主要使用了双向链表和一个map容器,双向链表主要存储缓存信息节点,map用法快速查找一个信息节点(这里你可以采用查找更高效的hash_map,考虑系统一致性这里没有采用hash_map)。
三:LRU缓存源码
3.1 cacheLRU.h
/*! * \file cacheLRU.h * \brief 计算节点数据缓存 * * \author **** * \version 1.0 * \date 2016.7.9 */#ifndef __LRUCACHE_H__#define __LRUCACHE_H__#include <string.h>#include <pthread.h>#include <map>#include <iostream>#define CHARSET_NAME_LEN 128using std::map;using std::string;typedef struct Node{ char key[CHARSET_NAME_LEN];char *data;//动态分配long bufferSpace;//size of the datalong high;//total num of the datalong width;//length of each pass int the data Node *prev, *next;}Node;class LRUCache{public: LRUCache(long total_pace, bool is_pthread_safe = false){totalSpace=availableSpace=total_pace;nodeNums=0; pthread_safe = is_pthread_safe; if(pthread_safe) pthread_mutex_init(&cached_mutex , NULL); head = new Node; tail = new Node; head->prev = NULL; head->next = tail; tail->prev = head; tail->next = NULL; }LRUCache(){} ~LRUCache(){ if(pthread_safe) pthread_mutex_destroy(&cached_mutex);Node *delNode=head->next;while(delNode!=tail){Node *temNode=delNode->next;delete delNode->data;delete delNode;delNode=temNode;}delete head;delete tail;availableSpace=0; }bool init(long total_pace, bool is_pthread_safe = false){totalSpace=availableSpace=total_pace;nodeNums=0; pthread_safe = is_pthread_safe; if(pthread_safe) pthread_mutex_init(&cached_mutex , NULL); head = new Node; tail = new Node; head->prev = NULL; head->next = tail; tail->prev = head; tail->next = NULL;}void setPthread_safe(bool flag){pthread_safe=flag;} bool Put(const char *key, char *data,long size,long dictHigh); Node * Get(const char *key); void viewCacheList();private: void cached_lock(void){ if(pthread_safe) pthread_mutex_lock(&cached_mutex); } void cached_unlock(void){ if(pthread_safe) pthread_mutex_unlock(&cached_mutex); } void detach(Node* node){ node->prev->next = node->next; node->next->prev = node->prev; } void attach(Node* node){ node->prev = head; node->next = head->next; head->next = node; node->next->prev = node; }private: map<string, Node* > cached_map; Node * head, *tail; long totalSpace;//total size of cache long availableSpace;//available space for new cache int nodeNums;//the total nums of nodes. bool pthread_safe; pthread_mutex_t cached_mutex;};#endif
3.2 cacheLRU.cpp
#include <iostream>#include "cacheLRU.h"using namespace std;void LRUCache::viewCacheList(){Node *delNode=head->next;std::cout<<"availableSpace::"<<availableSpace<<" totalSpace::"<<totalSpace<<"nodeNums::"<<nodeNums<<endl;while(delNode!=tail){std::cout<<"cacheName::"<<string(delNode->key)<<" size::"<<delNode->bufferSpace<<std::endl;delNode=delNode->next;}}bool LRUCache::Put(const char *key , char *data ,long data_size,long dictHigh){ cached_lock(); Node *node = cached_map[string(key)]; if(node){ detach(node); node->data = data; attach(node);return true; } else{/*新插入缓存必须检查缓冲区大小,如果可用容量不足,则删除最近最少使用的缓存,直至有充足的缓存空间*/while(availableSpace<data_size){Node *temNode=tail->prev;if(temNode!=head){cout<<"delete cache::"<<string(temNode->key)<<" size::"<<temNode->bufferSpace<<endl;temNode->prev->next=tail;tail->prev=temNode->prev;availableSpace+=temNode->bufferSpace;--nodeNums;delete temNode->data;//回收内存delete temNode;temNode=NULL;}elsereturn false;}node=new Node;memcpy(node->key, key, CHARSET_NAME_LEN);node->data=new char[data_size];memcpy(node->data, data, data_size);node->bufferSpace=data_size;node->high=dictHigh;cached_map[string(key)] = node;attach(node);availableSpace-=data_size;++nodeNums;return true; } cached_unlock();}Node * LRUCache::Get(const char *key){ cached_lock(); Node *node = cached_map[key]; if(node){ detach(node); attach(node); cached_unlock(); return node; } else{ cached_unlock(); return NULL; }}
0 0
- 最近最少使用缓存算法LRU
- LRU算法,最近最少使用算法
- LRU算法,最近最少使用算法
- 自适应Lru(最近最少使用)算法
- 最近最少使用(LRU)算法模拟--LeastRecentPage
- 缓存淘汰算法--LRU算法【最近最少使用算法LRU置换策略适用于热点数据比较多的场景】
- leetcode LRU Cache(高级缓存的最近最少使用算法实现)
- Java实现LRU(最近最少使用)缓存
- Java实现LRU(最近最少使用)缓存
- LRU Cache 最近最少使用缓存的设计
- Java实现LRU(最近最少使用)缓存
- LRU(最近最少使用页面置换算法)淘汰算法
- LRU(最近最少使用页面置换算法)淘汰算法
- C++模拟操作系统最近最少使用算法(LRU),acm
- [Leetcode-146] LRU Cache 最近最少使用页面置换算法
- 基于最少使用频次的LRU,LFU缓存淘汰算法
- 操作系统页面置换算法之最近最少使用算法(LRU)
- Java--缓存热点数据,最近最少使用算法
- 末日孤舰第三季/全集The Last Ship 迅雷下载
- HashMap中取出全部的key
- 对缓冲(caching)技术的一些学习总结
- SCU4504 奶牛合影 最小表示法
- 先进先出缓存算法(FIFO)--java实现
- 最近最少使用缓存算法LRU
- LeetCode:Super Ugly Number系列
- 作为一个程序员,怎么高效的写代码
- 存储方案的选择
- Nesting常用的6种用法以及举例
- Codeforces Round #120(190D) Non-Secret Cypher(尺取法)
- HashMap取出全部的value
- 实现ViewPager的左右循环滑动
- Android内存泄漏的八种可能