首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java中实现LRU Cache

,LRU(Least Recently Used,最近最少使用)是一种缓存淘汰算法,它根据数据的访问顺序来决定是否淘汰某个缓存项。以下是实现LRU Cache的步骤:

  1. 创建一个双向链表来维护缓存项的顺序,每个节点包含key和value两个属性。
  2. 创建一个HashMap来存储key和对应的节点对象,以实现快速查找。
  3. 设定缓存的容量大小,如果插入新的缓存项时超过容量大小,则需要删除最久未使用的缓存项。
  4. 在获取缓存项时,如果该项存在于缓存中,则将其移到链表的头部,表示最近使用过。
  5. 在插入新的缓存项时,如果该项已存在于缓存中,则更新其值,并将其移到链表头部。如果不存在于缓存中,则创建新的节点,并将其插入链表头部,同时将其添加到HashMap中。
  6. 在删除缓存项时,如果该项存在于缓存中,则将其从链表和HashMap中删除。

下面是一个示例代码实现:

代码语言:txt
复制
import java.util.HashMap;

class LRUCache {
    private int capacity;
    private Node head;
    private Node tail;
    private HashMap<Integer, Node> map;

    class Node {
        int key;
        int value;
        Node prev;
        Node next;

        Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }

    public LRUCache(int capacity) {
        this.capacity = capacity;
        map = new HashMap<>();
        head = new Node(0, 0);
        tail = new Node(0, 0);
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            remove(node);
            addToHead(node);
            return node.value;
        }
        return -1;
    }

    public void put(int key, int value) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            node.value = value;
            remove(node);
            addToHead(node);
        } else {
            if (map.size() >= capacity) {
                map.remove(tail.prev.key);
                remove(tail.prev);
            }
            Node node = new Node(key, value);
            map.put(key, node);
            addToHead(node);
        }
    }

    private void remove(Node node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    private void addToHead(Node node) {
        node.next = head.next;
        node.next.prev = node;
        node.prev = head;
        head.next = node;
    }
}

上述代码使用双向链表和HashMap实现了LRU Cache。双向链表用于维护缓存项的顺序,HashMap用于实现快速查找。LRUCache类的构造函数初始化了缓存的容量、双向链表的头部和尾部节点,以及HashMap。get()方法根据缓存项的键获取对应的节点,并将该节点移到链表的头部,表示最近使用过。put()方法插入新的缓存项时,如果容量已满,则删除链表尾部的节点和对应的HashMap中的键值对,然后将新的节点插入链表头部,并加入HashMap中。如果缓存项已存在,则更新其值并将其移到链表头部。

这是一个简单的LRU Cache实现示例,适用于小规模的缓存场景。在实际应用中,还需要根据具体需求对LRU Cache进行性能优化和线程安全处理。

关于腾讯云相关产品和产品介绍链接地址,可以参考腾讯云官方文档:https://cloud.tencent.com/document/product/583

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

设计实现一个LRU Cache1 什么是LRU Cache2 实现思路

1 什么是LRU Cache LeetCode上有一个LRU Cache实现的题目 Design and implement a data structure for Least Recently...操作系统的内存管理,有一类很重要的算法就是内存页面置换算法(包括FIFO,LRU,LFU等几种常见页面置换算法)。...LRU算法的设计原则 如果一个数据最近一段时间没有被访问到,那么将来它被访问的可能性也很小 也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰 而用什么数据结构来实现LRU算法呢...(get或put)的节点保持限定容量的Cache,如果超过容量则应该把LRU(近期最少使用)的节点删除掉。...2 实现思路 在学习了HashMap和LinkedHashMap后,是不是觉得这俩数据结构简直太适合做LRU Cache了!

1.2K70

动手实现一个 LRU cache

前言 LRU 是 LeastRecentlyUsed 的简写,字面意思则是 最近最少使用。 通常用于缓存的淘汰策略实现,由于缓存的内存非常宝贵,所以需要根据某种规则来剔除数据保证内存不被撑满。...之前也有接触过一道面试题,大概需求是: 实现一个 LRU 缓存,当缓存数据达到 N 之后需要淘汰掉最近最少使用的数据。...不过其中的 putget 流程算是一个简易的 HashMap 实现,可以对 HashMap 加深一些理解。 实现二 因此如何来实现一个完整的 LRU 缓存呢,这次不考虑过期时间的问题。...初始化时自定义是否需要删除最近不常使用的数据,如果是则会按照实现的方式管理数据。...总结 以上就是对 LRU 缓存的实现,了解了这些至少平时使用时可以知其所以然。 当然业界使用较多的还有 guava 的实现,并且它还支持多种过期策略。

22220
  • 动手实现一个 LRU cache

    前言 LRU 是 Least Recently Used 的简写,字面意思则是最近最少使用。 通常用于缓存的淘汰策略实现,由于缓存的内存非常宝贵,所以需要根据某种规则来剔除数据保证内存不被撑满。...之前也有接触过一道面试题,大概需求是: 实现一个 LRU 缓存,当缓存数据达到 N 之后需要淘汰掉最近最少使用的数据。...不过其中的 put get 流程算是一个简易的 HashMap 实现,可以对 HashMap 加深一些理解。 实现二 因此如何来实现一个完整的 LRU 缓存呢,这次不考虑过期时间的问题。...初始化时自定义是否需要删除最近不常使用的数据,如果是则会按照实现的方式管理数据。...总结 以上就是对 LRU 缓存的实现,了解了这些至少平时使用时可以知其所以然。 当然业界使用较多的还有 guava 的实现,并且它还支持多种过期策略。

    42330

    用 Go 实现一个 LRU cache

    前言 早在几年前写过关于 LRU cache 的文章:https://crossoverjie.top/2018/04/07/algorithm/LRU-cache/ 当时是用 Java 实现的,最近我完善...Go 官方库并没有相关的实现,考虑到程序的简洁就不打算依赖第三方库,自己写一个;本身复杂度也不高,没有几行代码。...配合这个数据结构,我便在 ptg 实现了请求历史记录的功能: 将每次的请求记录存储到 lru cache ,最近使用到的历史记录排在靠前,同时也能提供相关的搜索功能;具体可见下图。...实现 实现原理没什么好说的,和 Java 的一样: 一个双向链表存储数据的顺序 一个 map 存储最终的数据 当数据达到上限时移除链表尾部数据 将使用到的 Node 移动到链表的头结点 虽然 Go 比较简洁...最终就是通过这个 LruCache 实现了上图的效果,想要了解更多细节的可以参考源码: https://github.com/crossoverJie/ptg/blob/main/gui/lru.go

    25420

    使用Python标准库functoolslru_cache实现缓存

    /notebook-yiSh32rr/lib/python3.6/functools.py Type: function 可以看出lru_cache使用了LRU算法,maxsize大小的空间内缓存函数的结果...,值得一提的事函数的参数是要可以哈希的,接下来我们利用lru_cache改进我们的递归算法,非常的简单。...from functools import lru_cache @lru_cache(100) def fib(n): if n < 2: return 1 else:...生成器的方案因为不方便直接计算fib(n),要配合range函数使用,会慢上一个数量级,不过合适的场景下生成器反而会很合适。...lru_cache比起成熟的缓存系统还有些不足之处,比如它不能设置缓存的时间,只能等到空间占满后再利用LRU算法淘汰出空间出来,并且不能自定义淘汰算法,但在简单的场景很适合使用,就像本文的例子写出简单直接的递归算法而不用担心其效率

    2.5K40

    用functools.lru_cache实现Python的Memoization

    用functools.lru_cache实现Python的Memoization 现在你已经看到了如何自己实现一个memoization函数,我会告诉你,你可以使用Python的functools.lru_cache...我发现functools.lru_cache是一个很好的例子。lru_cache装饰器是Python标准库实现的易于使用的记忆功能。...这一次,我会告诉你如何使用functools.lru_cache装饰器添加记忆: 请注意我给lru_cache传递的maxsize参数是同时来限制存储缓存的项目数量。...不同的是,在这个例子,我函数定义的时候使用了@lru_cache装饰器。这意味着这次递归调用fibonacci()也缓存查找。...为什么你应该喜欢 functools.lru_cache 一般来说,由functools.lru_cache实现的Python的memoization比我们的专用memoize函数更全面,就像你CPython

    97190

    缓存淘汰算法与 python lru_cache 装饰器的实现

    先进先出 — FIFO FIFO 即 First In First Out 的缩写,这可以说是实现起来最简单的一种算法了。 缓存维护一个队列,总是队首插入数据,当缓存区满时,则删除队尾数据。...LRU实现 — python 标准库 functools.lru_cache 装饰器的实现 python 标准库的 functools.lru_cache 装饰器实现了一个 LRU 算法的缓存,用来缓存方法所有参数与返回值的对应关系...通过缓冲区与环形双向链表的同步操作完成 LRU 算法的实现。...之前,实现最近使用数据链表位置的提升 【缓存未命中且队列未满】 当插入元素未命中缓存,则创建该元素的节点,并直接在环形双线链表的 root 之前插入节点,cache[key] 赋值为插入节点 【缓存未命中且队列已满...利用 lru_cache 优化方法执行 此前我们曾经提到,由于 python 没有尾递归优化,递归执行算法效率是很低的。 在此前的文章,针对这一情况,我们自行实现了简易的尾递归优化。

    50020

    使用线程安全型双向链表实现简单 LRU Cache 模拟

    使用线程安全型双向链表实现简单 LRU Cache 模拟 目录 博主介绍 前言 1、动机 1.1、要解决的问题 2、系统设计 2.1、系统总体框架 2.2、系统功能模块 2.3 系统整体流程 3、数据结构设计...github:https://github.com/sendwe/-LRU-Cache- 1、动机 ​ 计算机内部,通常存在多个线程访问同一个双向链表的问题。...链表正常访问:多线程环境下,能正确地访问链表。同时能提供打印链表、查询链表等功能。 链表在生产环境能正确运行:实际生产环境当中,链表能稳定运行。...函数名称 介绍 Clone() 复制一个一模一样的双向链表 Connect() 连接两个链表 LRU() 使用该数据结构实现LRU 缓存调度算法 2.3 系统整体流程 下方是流程图描述的是使用该数据结构实现的...同时考虑到多个连续操作时,线程锁连续地释放又被申请,造成了一定不必要的系统开销。因此 LRU里面,可以将这三个函数拆解开来,放入到同一个临界区,这样就解决了这个问题。

    78410

    LRU的理解与Java实现

    简介 LRU(Least Recently Used)直译为“最近最少使用”。...其实很多老外发明的词直译过来对于我们来说并不是特别好理解,甚至有些词并不在国人的思维模式之内,比如快速排序的Pivot,模拟信号的Analog 等等。...所以为了力求方便理解,下面我们先来看看LRU是什么,主要是为了解决什么问题。...这就是LRU策略。 映射到计算机概念,上述例子中小明的衣柜就是内存,而小明的衣服就是缓存数据。我们的内存是有限的。...所以对于LRU的抽象总结如下: 缓存的容量是有限的 当缓存容量不足以存放需要缓存的新数据时,必须丢掉最不常用的缓存数据 实现 理解了LRU的原理之后,想要将其转换为代码并不是一件很困难的事。

    42120

    Java和Android的LRU缓存及实现原理

    一、概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。...Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHashMap,进行了极少的改动后就可以实现LRU算法。...二、JavaLRU算法 JavaLRU算法的基础是LinkedHashMap,LinkedHashMap继承了HashMap,并且HashMap的基础上进行了一定的改动,以实现LRU算法。...LinkedHashMap的removeEldestEntry(eldest)方法永远返回false,如果我们要实现LRU算法,就需要重写这个方法,判断什么情况下,删除最近最不常使用的节点。...这个方法HashMap为空,LinkedHashMap的Entry则实现了这个方法。其中remove()方法的两行代码为双向链表删除当前节点的标准代码,不解释。 ?

    91110

    10行Java代码实现最近被使用(LRU)缓存

    最近的面试,我曾被多次问到,怎么实现一个最近最少使用(LRU)的缓存。缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题。现在我们看一下怎么实现。...最近最少使用缓存的回收 为了实现缓存回收,我们需要很容易做到: 查询出最近最晚使用的项 给最近使用的项做一个标记 链表可以实现这两个操作。检测最近最少使用的项只需要返回链表的尾部。...比较困难的事情是怎么快速的链表中找到该项。 哈希表的帮助 看一下我们工具箱的数据结构,哈希表可以(消耗)常量的时间内索引到某个对象。...如果我们创建一个形如key->链表节点的哈希表,我们就能够常量时间内找到最近使用的节点。...无需多说: import java.util.LinkedHashMap; import java.util.Map; public LRUCache extends LinkedHashMap

    1.1K40

    10行Java代码实现最近被使用(LRU)缓存

    最近的面试,我曾被多次问到,怎么实现一个最近最少使用(LRU)的缓存。缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题。现在我们看一下怎么实现。...最近最少使用缓存的回收 为了实现缓存回收,我们需要很容易做到: 查询出最近最晚使用的项 给最近使用的项做一个标记 链表可以实现这两个操作。检测最近最少使用的项只需要返回链表的尾部。...比较困难的事情是怎么快速的链表中找到该项。 哈希表的帮助 看一下我们工具箱的数据结构,哈希表可以(消耗)常量的时间内索引到某个对象。...如果我们创建一个形如key->链表节点的哈希表,我们就能够常量时间内找到最近使用的节点。...无需多说: import java.util.LinkedHashMap; import java.util.Map; public LRUCache extends LinkedHashMap

    59020

    NodeJSLRU缓存(CLOCK-2-hand)实现

    原文参考:https://www.codeproject.com/Articles/5299328/LRU-Cache-CLOCK-2-hand-Implementation-In-NodeJS 文章的开始我们需要了解什么是缓存...考虑到存储速度最慢数据决系统吞吐量的这一点,LRU缓存的存在能将系统性能提高2倍至100倍;同时,异步LRU会隐藏全部高速缓存未命中的延迟。 接下来我们一起来看具体实现的内容。...异步缓存未命中回调的工作方式如下: 1.一些get()缓存找不到密钥 2.算法找到对应插槽 3.运行此回调: 回调,重要计算异步完成...隐藏延迟是影响吞吐量高低的重要因素,这一点web应用尤为明显。...总结: 文本详细介绍了NodeJSLRU算法缓存的实现,希望可以为大家提供新的思路,更好的开发中提升系统性能。

    66330

    Linux Page Cache调优 Kafka 的应用

    Page Cache是针对文件系统的缓存,通过将磁盘的文件数据缓存到内存,从而减少磁盘I/O操作提高性能。...如果有,那么直接从内存读取,不需要访问磁盘,这被称为cache命中(cache hit); 如果cache没有请求的数据,即cache未命中(cache miss),就必须从磁盘读取数据。...3、写Cache 当内核发起一个写请求时(例如进程发起write()请求),同样是直接往cache写入,后备存储的内容不会直接更新(当服务器出现断电关机时,存在数据丢失风险)。...的数据就永远无法持久化到磁盘,这种情况下,一旦服务器重启,那么cache的数据必然丢失。...当数据量没有达到阀值,但是达到了我们设定的过期时间,同样可以实现数据刷盘。 这样可以有效的解决上述存在的问题,其实这种设计绝大部分框架中都有。

    2.8K30

    cacheAI处理器设计的作用

    由于每次内部访问都相对较慢,因此实现此目的的方式是设备内部执行一系列burst访问。...速度更快的方案 解决方案是使用高速SRAM处理设备内部创建本地cache存储。当处理器首次从 DRAM 请求数据时,该数据的副本将存储处理器的cache。...从外部 DRAM 访问一系列数据字的第一个需要高达 70 ns。 图1 cache和 DRAM ‍访问‍速度‍‍‍‍‍‍‍‍‍‍ cache AI 的作用 AI 的实现和部署方案种类繁多。...维护cache一致性会产生开销。许多情况下,AI 加速器不需要保持cache一致性,达到与处理器集群相同的程度。例如,可能只有加速器处理了大量数据后,才需要重新同步,这可以软件控制下实现。...许多情况下,加速器 IP 的开发人员在其实现不包括cache。有时,性能评估开始之前,没有认识到对cache的需求。

    16610

    Java,使用HttpUtils实现发送HTTP请求

    微信公众号:冯文议(ID:fwy-world) HTTP请求,日常开发,还是比较常见的,今天给大家分享HttpUtils如何使用。...第一部分:简单总结HTTP请求常用配置 大家好, Java 开发,经常遇到需要调用第三方提供的接口服务,常见的形式是 HTTP + JSON,下面,就对 http 请求常见的设置,做一个说明 http...提供多种请求方式,以满足我们日常需要,先按请求方式来做说明: GET POST PUT PATCH DELETE RESTful API 开发,我们可以根据这些请求方式设计我们的API接口。...为了兼容多种HTTP工具实现请求,引入了 HttpClientFactory,其他工具类,只要实现 HttpClient 接口,就行。...我是小冯,一名Java程序员,专注于程序设计和开发,如果你开发上遇到问题,欢迎一起交流。

    3.9K00

    2016头条校招笔试题(LRU)算法之JAVA实现

    操作系统可以使用LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足,则会按照最近访问时间进行排序,并将最老的数据淘汰。...JAVA实现: 首先实现一个固定长度的集合队列 package com.itstyle.list; import java.util.Collection; import java.util.Iterator...; import java.util.LinkedList; import java.util.Queue; /** * 实现一个固定长度的集合队列 * 开发,有时候我们会遇到这样的需求...: * 对一个集合操作,提前为集合指定最大大小,我们不断向集合添加数据的时候,当数据内容超过最大值的时候,自动将最先入队的元素移除队列。...; import java.util.List; /** * 操作系统可以使用LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足, * 则会按照最近访问时间进行排序

    798100

    Java实现Postman自动生成Cookie的功能

    Java实现Postman自动生成Cookie的功能,通常涉及到模拟HTTP请求,处理服务器的响应,并提取Cookie信息。...这个过程可以使用一些Java库,如Apache HttpClient或者OkHttp。网络的Cookie,指的是当你使用互联网时,网站服务器发送到你的浏览器并存储本地计算机上的一小段数据。...**购物车功能**:在线购物网站使用Cookie来记住你放入购物车的商品,即使你关闭了浏览器或重新访问网站,这些商品仍然购物车。4....以下是使用Apache HttpClient来实现这个功能的步骤:步骤 1:添加依赖首先,您需要在项目的​​pom.xml​​文件添加Apache HttpClient的依赖,如果您使用的是Maven...此外,如果您想要模拟Postman的更多功能,如设置请求头、发送POST请求等,您需要相应地修改代码。

    11110
    领券