当前位置: 首页 > article >正文

Glide系列-活动缓存和内存缓存

1.活动缓存数据结构用的HashMap

final class ActiveResources {
    @VisibleForTesting final Map<Key, ResourceWeakReference> activeEngineResources = new             
                 HashMap<>();
}

2.内存缓存LinkedHashMap

public class LruCache<T, Y> {
    private final Map<T, Entry<Y>> cache = new LinkedHashMap<>(100, 0.75f, true);
}

3.从活动或者内存缓存读取

public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {

    private EngineResource<?> loadFromMemory( EngineKey key, boolean isMemoryCacheable, 
       long startTime) {
        if (!isMemoryCacheable) {//是否支持内存缓存
            return null;
        }

        EngineResource<?> active = loadFromActiveResources(key);//从活动缓存获取
        if (active != null) {//如果活动缓存不为null
            return active;
        }

        EngineResource<?> cached = loadFromCache(key);//从内存缓存获取
        if (cached != null) { //如果内存缓存不为null
            return cached; 
        }

        return null;
    }
}

4.从活动缓存获取

public class Engine
    implements EngineJobListener,
        MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
    @Nullable
    private EngineResource<?> loadFromActiveResources(Key key) {
        EngineResource<?> active = activeResources.get(key); //从活动缓存获取
        if (active != null) {
            active.acquire();
        }

        return active;
    }
}
  

5.从内存缓存获取

  • 从活动缓存中移除这个元素
  • 返回
  • 将获得的元素放入活动缓存
public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
    private EngineResource<?> loadFromCache(Key key) {
        EngineResource<?> cached = getEngineResourceFromCache(key); //获得内存缓存
        if (cached != null) {
            cached.acquire();
            activeResources.activate(key, cached);//放入活动缓存
        }
        return cached;
    }
}
    
public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {

    private EngineResource<?> getEngineResourceFromCache(Key key) {
        Resource<?> cached = cache.remove(key);//从内存缓存移除

        final EngineResource<?> result; //返回的元素是新建的
        if (cached == null) {
            result = null;
        } else if (cached instanceof EngineResource) {
          // Save an object allocation if we've cached an EngineResource 
          //(the typical case).
            result = (EngineResource<?>) cached;
        } else {
            result = new EngineResource<>(
              cached,
              /* isMemoryCacheable= */ true,
              /* isRecyclable= */ true,
              key,
              /* listener= */ this);
        }
        return result;
    }
}

6.总结

  • 先从活动缓存读取;
  • 如果活动缓存读取到的为null,再从内存缓存读取;
  • 从内存缓存读取的时候,会将缓存的值从内存缓存移除,再放入活动缓存;

http://www.kler.cn/a/157193.html

相关文章:

  • pytorch MoE(专家混合网络)的简单实现。
  • 在JavaScript中,let 和 const有什么不同
  • 【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用
  • iOS开发代码块-OC版
  • Python——day09
  • AttributeError: module ‘numpy‘ has no attribute ‘bool‘.
  • 人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100
  • 兔子的后院奇遇:深入了解RabbitMQ中的死信队列【RabbitMQ 四】
  • 基于python电商销售数据可视化大屏全屏系统设计与实现+开题报告
  • pytorch bert实现文本分类
  • 前端开发_CSS
  • 大数据之HBase(二)
  • 《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖
  • Linux基础操作一:连接Linux
  • 从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
  • 【shell】
  • 华为云购买参考:到底选购ECS还是CCE?
  • STL常用算法-C++
  • acwing1209.带分数暴力与优化(java版)
  • python pyaudio 录取语音数据
  • 【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁
  • Java 设计模式——备忘录模式
  • docker compose 搭建reids集群 1主2从架构
  • 【C语言】递归详解
  • 【powerjob】定时任务调度器 xxl-job和powerjob对比
  • SQL Sever 基础知识 - 数据筛选(2)