简单LRU算法实现缓存大小的限制策略
2014-12-03 16:58
831 查看
参考:Android-Universal-Image-Loader
private final Map<File, Long> mLastUsageDates = Collections.synchronizedMap(new HashMap<File, Long>()); private final AtomicInteger mCacheSize; private final int SIZE_LIMIT = 10 * 1024 * 1024; { mCacheSize = new AtomicInteger(); calculateCacheSizeAndFillUsageMap(); } { saveImage(name); putImage(name); } private void calculateCacheSizeAndFillUsageMap() { new Thread(new Runnable() { @Override public void run() { int size = 0; File imageDir = new File(DIR_IMAGE); File[] cachedFiles = imageDir.listFiles(); if(cachedFiles != null){ for(File cachedFile : cachedFiles){ size += cachedFile.length(); mLastUsageDates.put(cachedFile, cachedFile.lastModified()); } mCacheSize.set(size); } } }).start(); } private void putImage(String path){ if(path == null) return; File imageFile = new File(path); if(!imageFile.exists()) return; int valueSize = (int)imageFile.length(); int curCacheSize = mCacheSize.get(); while (curCacheSize + valueSize > SIZE_LIMIT) { int freedSize = removeMostLongUsedFile(); if (freedSize == -1) break; curCacheSize = mCacheSize.addAndGet(-freedSize); } mCacheSize.addAndGet(valueSize); mLastUsageDates.put(imageFile, imageFile.lastModified()); } private int removeMostLongUsedFile(){ if (mLastUsageDates.isEmpty()) { return -1; } Long oldestUsage = null; File mostLongUsedFile = null; Set<Entry<File, Long>> entries = mLastUsageDates.entrySet(); synchronized (mLastUsageDates) { for (Entry<File, Long> entry : entries) { if (mostLongUsedFile == null) { mostLongUsedFile = entry.getKey(); oldestUsage = entry.getValue(); } else { Long lastValueUsage = entry.getValue(); if (lastValueUsage < oldestUsage) { oldestUsage = lastValueUsage; mostLongUsedFile = entry.getKey(); } } } } int fileSize = 0; if (mostLongUsedFile != null) { if (mostLongUsedFile.exists()) { fileSize = (int)mostLongUsedFile.length(); if (mostLongUsedFile.delete()) { mLastUsageDates.remove(mostLongUsedFile); } } else { mLastUsageDates.remove(mostLongUsedFile); } } return fileSize; }
相关文章推荐
- 利用LinkedHashMap简单实现基于LRU策略的缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 基于LinkedHashMap实现LRU缓存调度算法原理
- LRU算法的简单实现( C语言 + uthash包)
- LRU缓存的实现算法讨论
- 简单LRU算法实现的Cache(C++)
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- 缓存失效策略(FIFO 、LRU、LFU三种算法的区别)
- LRU 算法简单实现
- 基于LinkedHashMap实现LRU缓存调度算法原理
- leetcode LRU Cache(高级缓存的最近最少使用算法实现)
- 利用LinkedHashMap实现LRU算法缓存
- 缓存淘汰算法--LRU算法【最近最少使用算法LRU置换策略适用于热点数据比较多的场景】
- 简单的java缓存实现(LRU,LFU,FIFO)
- 蛙蛙推荐: LRU缓存的实现算法讨论
- Lru缓存的简单实现