LRU 最近未使用算法

本文详细介绍了LRU(最近最少使用)算法的工作原理,并提供了一个使用链表和哈希表实现的Java代码示例。LRU算法通过淘汰最近最少使用的数据来保持缓存容量,其核心是快速定位和淘汰数据。文章还提及了HBSE如何利用ConcurrentHashMap进行LRU缓存管理。
摘要由CSDN通过智能技术生成
LRU(Least recently used,最近未使用算法)
算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

链表(处理新老关系)+ 哈希(查询在不在) 整体时间复杂度可以达到O(1)



import lombok.Data;

import java.util.HashMap;

public class LRUCache {

    int capacity;
    HashMap<Integer, Node> map; 时间复杂度O(1),找到对应Node节点
    Node head;//满了 需要删除的节点
    Node end; //为最近使用的数据

    //这个初始化非常重要 省的处理head end节点为null
    public LRUCache(int capacity) {
        this.capacity = capacity;
        map = new HashMap<>();
        head = new Node(-1, -1);
        end = new Node(-1, -1);
        head.next = end;
        end.pre = head;

    }

    public void put(int key, int value) {
        // 调用get方法 如果存在则会
        if (get(key) != -1) {
            map.get(key).value = value;
            return;
        }
        //如果不存在,新增一个节点,放到end节点
        Node node = new Node(key, value);
        map.put(key, node);
        moveToEnd(node);

        if (map.size() > capacity) {
            map.remove(head.next.key);
            head.next = head.next.next;
            head.next.pre = head;
        }
    }

    public int get(int key) {
        if (!map.containsKey(key)) {
            return -1;
        }
        Node node = map.get(key);
        // 删除该节点,需要两步
        node.pre.next = node.next;
        node.next.pre = node.pre;
        moveToEnd(node);

        return node.value;
    }

    //移动节点到end前,需要四步
    private void moveToEnd(Node node) {
        node.pre = end.pre;
        end.pre = node;
        node.pre.next = node;
        node.next = end;
    }

    @Data
    class Node {
        int key;
        int value;
        Node pre;
        Node next;

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

    public static void main(String[] args) {
        LRUCache lru = new LRUCache(3);
        lru.put(1, 1);
        lru.put(2, 2);
        lru.put(3, 3);
        lru.put(4, 4);
        lru.put(5, 5);
        lru.get(1);
        lru.put(1, 1);
    }

PS:

HBSE的LRU缓存机制

ConcurrentHashMap来维护key-value,将最近最少使用的Block置换出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值