前奏:如果 CPU 访问的页面不在内存中,则操作系统需要进行置换出内存中的页面,然后把需要访问的页面从磁盘中置换到内存中,而这种算法最常见的就是 LRU 算法,LRU 算法也被称最近最少使用算法.
假如现在有一个需求,公司需要抽出一个用户系统,向各个业务系统提供用户的基本信息
设计方法1:用户信息存储在数据库,但是如果每一次请求都去查询数据库的话,会大大的降低性能,所以可以选择在内存中创建一个哈希表,每次先去哈希表中查询,如果找不到再去数据库查询.
这种方法确实可以提高性能,但是内存大小有限,如果用户的数量越来越多,内存一旦溢出,可能会造成服务器的奔溃,所以我们可以考虑在内存的哈希表内删除一些不常用的用户信息
LRU 算法的思想是:长期不被使用的数据,在未来被用到的几率也不大,因此当占用内存达到一个阀值时,就删除不常使用的数据
如何实现 LRU 算法
数据结构:哈希链表
在哈希链表中,key 和 value 具有固定的排列顺序,就像双向链表一样,每一个键值对都有一个前驱,一个后驱.
如果访问一个数据,首先查看哈希链表中是否存在,如果存在则把它删除,然后添加到哈希链表的尾部,如果要查找的元素不存在哈希链表中,则进行数据库的查询,然后添加到哈希链表的尾部,这样一来,最近最少使用的数据就在哈希链表的头部了,然后就可以直接删除了。
代码实现
class LRUCache {
public:
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {