Cache——缓存
缓存是临时存放数据的区域,缓存的运行速度比内存快得多,设计好一个缓存结构能够帮助我们更快地运行程序。
进来在阿里面试的时候也遇到设计一个缓存的问题,同时leetcode和Hihocoder上都出现了设计缓存的问题,因此特此整理出来以便后续回忆。
设计思路
本文将最为常见的缓存的设计思路,学习操作系统的时候,我们直到一个内存置换的算法:LRU(Least Recently Used)。常用缓存的设计思路是一致的,每次查询(或者输入)一个新的数据的时候,若该数据不在缓存中,那么需要将缓存中“最不常用”的数据删掉,并将该数据放置在缓存的起始位置(意思就是最快能取到的地方),因为我们有假设:当前我们用的数据很有可能在未来频繁的用到。
结构实现
上述讲了大致的cache设计思路,根据思路我们可以直接想到缓存中必须有一个标志变量来表示的缓存的容量:m_capacity。
而最终我们选择使用链表来存储所有的缓存数据(以下假设数据是string),并用一个map来保存每个数据以及其在链表中的位置。利用map我们可以每次快速判断新来的数据是否在缓存中。
具体如下:
list<string> m_list;//链表来保存实际数据
typedef unordered_map<string, list<string>::iterator> Map_t;
Map_t map_t;//保存每个数据在链表中的位置
int m_capacity;