优惠券项目---------------第十一章

loadingCache比hashmap效率低。

看下这两个区别

// 存的是1  和TCoupon列表 一个map的结构
LoadingCache<Integer,List<TCoupon>> couponCache = CacheBuilder.newBuilder()
            .expireAfterWrite(10,TimeUnit.MINUTES).refreshAfterWrite(5,TimeUnit.MINUTES)
            .build(new CacheLoader<Integer, List<TCoupon>>() {
                @Override
                public List<TCoupon> load(Integer o) throws Exception {
                    return loadCoupon(o);
                }
            });

    // 存的是id和 单个Tcoupon hashmap的结构
    LoadingCache<Integer,TCoupon> couponIdsCache = CacheBuilder.newBuilder()
            .expireAfterWrite(10,TimeUnit.MINUTES).refreshAfterWrite(5,TimeUnit.MINUTES)
            .build(new CacheLoader<Integer,TCoupon>() {
                @Override
                public TCoupon load(Integer o) throws Exception {
                    return loadIdCoupon(o);
                }
            });

loadingCache集成了淘汰算法。可以优化储存。

-----------------------------------------------11-1-------------------------------------------------------------

LRU内存淘汰算法。

LRU:https://www.cnblogs.com/wyq178/p/9976815.html

基本原理:

双向链表有一个特点就是它的链表是双路的,我们定义好头节点和尾节点,然后利用先进先出(FIFO),最近被放入的数据会最早被获取。其中主要涉及到添加、访问、修改、删除操作。首先是添加,如果是新元素,直接放在链表头上面,其他的元素顺序往下移动;访问的话,在头节点的可以不用管,如果是在中间位置或者尾巴,就要将数据移动到头节点;修改操作也一样,修改原值之后,再将数据移动到头部;删除的话,直接删除,其他元素顺序移动;

-----------------------------------------------11-2-------------------------------------------------------------

实现:https://blog.csdn.net/qpzkobe/article/details/82318470

LFU:https://blog.csdn.net/u013164931/article/details/82803298

缺陷:尾部很可能被淘汰的。

-----------------------------------------------11-3-------------------------------------------------------------

来子未来的缓存Caffine介绍。

基于布隆过滤器:张三进来后,经过算法1,2,3,4去hash到进入到不同的槽位里面。并累加槽位的访问次数。每个槽位有一个计数器记录这个槽位被映射的次数。节省空间,槽位共用。所有映射道的最小的作为访问的频次。

计数器达到某个频次则全部/2。

-----------------------------------------------11-4-------------------------------------------------------------

代码:11.5

第一步:引入依赖

第二步:只改为caffie就可以了。

-----------------------------------------------11-5-------------------------------------------------------------

跑的结果:

对比:

GuavaCache:只是刷新和虚引用。

-----------------------------------------------11-6-------------------------------------------------------------

LRU:

package com.xdclass.couponapp;

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K,V> extends LinkedHashMap<K,V> {

    private int cacheSize;

    public LRUCache(int cacheSize){
        super(16,0.75f,true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        boolean r = size()>cacheSize;
        if(r){
            System.out.println("清除缓存key:" +eldest.getKey());
        }
        return r;
    }

    public static void main(String[] args) {
        LRUCache<String,String> cache = new LRUCache<>(5);
        cache.put("A","A");
        cache.put("B","B");
        cache.put("C","C");
        cache.put("D","D");
        cache.put("E","E");

        System.out.println("初始化:"+cache.keySet());
        System.out.println("访问值:"+cache.get("C"));
        System.out.println("访问C后:"+cache.keySet());
        System.out.println("访问值:"+cache.put("F","F"));
        System.out.println("put F后:"+cache.keySet());
    }
}

-----------------------------------------------11-7-------------------------------------------------------------

发布了374 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104791388