一次LRU算法的应用及实现

概述

  • 最近刚好有个述求是希望实时维护社区最常被访问的达人列表作为推荐数据源,前置流程我通过Redis里的HyperLogLog已经计算了各达人主页的PV、UV,故只剩下一个类似LRU机制的达人列表要持久化维护了
  • 复习下LRU的原理:LRU原理及实现

实现

  • 可以基于HashMap及LinkedList自己手写,也可以通过继承LinkedHashMap来设计,这里给出两种简单的实现方案:
public class LRUCache {

    /**
     * 基于HashMap记录k-v和数组记录元素访问顺序,数组首元素即为待剔除更新元素
     */
    private Map<Integer, Integer> keys = new HashMap<>();
    private List<Integer> visited = new LinkedList<>();
    private int cap;
    private int num = 0;

    public LRUCache(int capacity) {
        this.cap = capacity;
    }

    public int get(int key) {
        if (!keys.containsKey(key)) {
            return -1;
        }
        visited.remove((Integer)key);
        visited.add(key);
        return keys.get(key);
    }

    public void put(int key, int value) {
        if (keys.containsKey(key)) {
            visited.remove((Integer)key);
        } else if (num < cap) {
            num++;
        } else {
            keys.remove(visited.get(0));
            visited.remove(0);
        }

        keys.put(key, value);
        visited.add(key);
    }
}
private class LRUInnerCache extends LinkedHashMap<Integer, Integer> {

        private int cap;

        LRUInnerCache(int cap) {
            super(cap, 0.75f, true);
            this.cap = cap;
        }

        public int get(int key) {
            Integer value = super.get(key);
            if (value == null) {
                return -1;
            }
            return value;
        }

        public void put(int key, int value) {
            super.put(key, value);
        }

        @Override
        protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
            return this.size() > cap;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值