文档章节

LinkedHashMap实现热数据缓存

SunnyWu
 SunnyWu
发布于 07/05 17:36
字数 598
阅读 10
收藏 0

HashMap 或者 ConcurrentHashMap

是在Java 中使用最简单的本地缓存方式。ConcurrentHashMap多用于缓存更新的场景,因为它是线程安全的,可以保证数据的一致性。

LinkedHashMap类

提供了一个==自动清理最老元素==的功能,可以作为一个LRU(Least Recently Used ,表示最近最少使用)缓存使用。

将LinkedHashMap 改造成缓存

需要重写 LinkedHashMap 中 removeEldestEntry(Map.Entry<K,V> eldest) 这个方法。

默认返回false,不移除老的key,需要开发人员自己改造。

    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return false;
    }

自定义MyLruCache,来实现一个自动清理老数据,将热数据放在队尾。

package com.wuxiongwei.java.hashmap.linkedhashmap;

import java.util.LinkedHashMap;


public class MyLruCache<K, V> extends LinkedHashMap<K, V>
{
    private static final long serialVersionUID = 4504158311663914052L;



    @Override
    public V put(K key, V value) {
        //或者Map<String, String> cache = Collections.synchronizedMap(new LruCache<String, String>(3));
//        synchronized (this) {
            return super.put(key, value);
//        }
    }

    private int maxCacheSize;

    public MyLruCache(int maxCacheSize) {

        // 第三个参数为 accessOrder,默认为false。
        // 表示按照按照访问顺序排列元素,最近访问的元素会排在队末尾
        super(maxCacheSize, 0.75f, true);

        this.maxCacheSize = maxCacheSize;

    }

    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        //默认返回false,队列会越来越大
        // 当达到预设缓存上限时删除最老元素
        return this.size() >= maxCacheSize + 1;
    }
}


package com.wuxiongwei.java.hashmap.linkedhashmap;

import java.util.HashMap;
import java.util.Map;

public class Clinet1 {
    public static void main(String[] args) {
        MyLruCache<String, String> cache = new MyLruCache<String, String>(3);
        //如果MyLruCache本身不是线程安全的,可以使用Collections.synchronizedMap来打到线程安全的效果
        //Map<String, String> cache = Collections.synchronizedMap(new MyLruCache<String, String>(3));


        //初始化三个key
        cache.put("k1", "v1");
        System.out.println("put1:"+cache);
        cache.put("k2", "v2");
        System.out.println("put2:"+cache);
        cache.put("k3", "v3");
        System.out.println("put3:"+cache);

        //因为大小是3,添加第四个时会移除k1
        cache.put("k4", "v4");
        System.out.println("put4:"+cache);

        //访问一次 k2,k2对应的元素就会排在队尾部,被看做最新元素
        cache.get("k2");
        System.out.println("get5:"+cache);

        Map<String,String> multiKV = new HashMap<String,String>();
        multiKV.put("k5", "k5");
        multiKV.put("k6", "k6");
        cache.putAll(multiKV);
        System.out.println("get6:"+cache);
    }
}

输出结果

put1:{k1=v1}
put2:{k1=v1, k2=v2}
put3:{k1=v1, k2=v2, k3=v3}
put4:{k2=v2, k3=v3, k4=v4}
get5:{k3=v3, k4=v4, k2=v2}
get6:{k2=v2, k5=k5, k6=k6}

从例子中可见,通过简单的方式就可以快速实现一个LRU缓存类。

本文转载自:http://wuxiongwei.com/archives/linkedhashmap

上一篇: Spring-Assert
SunnyWu
粉丝 12
博文 66
码字总数 11164
作品 0
苏州
架构师
私信 提问
浅析LRUCache原理(Android)

一. LruCache基本原理 LRU全称为Least Recently Used,即最近最少使用。 由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间...

天王盖地虎626
06/17
67
0
Android LRUCache原理及使用(对象软引用不行,使用LRU算法)

> 对象软引用,弱引用 A a = new A(); SoftReference sr = new SoftReference(a); a = sr.get(); > LRUCache原理及使用 在Android中采用LRU算法的常用缓存有两种:LruCache和DisLruCache,分......

desaco
01/25
0
0
【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解

  今天来介绍一下容器类中的另一个哈希表———》LinkedHashMap。这是HashMap的关门弟子,直接继承了HashMap的衣钵,所以拥有HashMap的全部特性,并青出于蓝而胜于蓝,有着一些HashMap没有...

弗兰克的猫
2018/08/10
0
0
Java集合系列之LinkedHashMap

Java集合系列之LinkedHashMap Hello,大家好,前面给大家讲了HashMap,LinkedList,知道了HashMap为数组+单向链表,LinkedList为双向链表实现的。今天给大家介绍一个(HashMap+"LinkedList")的集...

2018/01/03
0
0
Android缓存机制&一个缓存框架推荐

新媒体管家 点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 轻量级缓存框架——ACache(ASimpleCache) ACache介绍 ACache类似于SharedPreferences,但是比SharedPre...

px01ih8
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
28分钟前
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
42分钟前
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
53分钟前
3
0
设计模式之依赖倒置原则

方法

东风破2019
54分钟前
6
0
关于如何通过模拟器完成模拟步数提升傻瓜式解决方案(囧)

因为对Android开发不太了解,也没去问朋友所以误打误撞找到的一个提升步数的解决方案,当然只是针对某安APP运动RUN的解决方式吧。 对Android不太了解,所以找了很多的解决方案来看看能不能破...

华山猛男
57分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部