精华内容
下载资源
问答
  • 内存缓存

    千次阅读 2019-03-20 10:21:30
    内存缓存 什么时候用 愿意消耗一些内存空间来提升速度 预料某些数据会被查询多次以上 缓存中存放的数据不会超过内存容量(应用程序的本地缓存,不会把数据存储到文件或服务器上) 可用方式 Google Guava Cache ...

    内存缓存

    什么时候用

    1. 愿意消耗一些内存空间来提升速度
    2. 预料某些数据会被查询多次以上
    3. 缓存中存放的数据不会超过内存容量(应用程序的本地缓存,不会把数据存储到文件或服务器上)

    可用方式

    • Google Guava Cache

        Guava Cache是google中非常方便易用的本地缓存实现,
        基于LRU算法(Least recently used,最近最少使用的数据。
        根据数据访问历史记录来进行淘汰数据)实现,支持多种缓存过期策略
      
    • ConcurrentHashMap

    比较

    使用

    Google Guava Cache 使用

    引用:

    		<dependency>
       	    <groupId>com.google.guava</groupId>
       	    <artifactId>guava</artifactId>
          	 <version>27.0.1-jre</version>
         </dependency>
    

    创建对象:

    	Cache<String, Object> cache = CacheBuilder
                                .newBuilder()
                                .build(); //最简便初始化对象
    
    初始化方法说明备注
    maximumSize()限制缓存的大小,如果缓存数量达到限制,则销毁最早的数据
    maximumWeight()权重值回收,超过设置的权重值回收。多个回收配合 weigher()使用
    weigher()根据一定计算拿到权重值配合maximumWeight()使用
    expireAfterWrite()缓存在设定时间内没有被 写(创建/修改),则回收适用:缓存数据总是在固定时候后变得陈旧不可用
    expireAfterAccess()缓存在设定时间内没有被 读/写 则回收
    weakKeys()使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(),使用弱引用键的缓存用而不是equals比较键暂不理解
    weakValues()使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(),使用弱引用值的缓存用而不是equals比较值暂不理解
    softValues()使用软引用存储值。软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。考虑到使用软引用的性能影响,我们通常建议使用更有性能预测性的缓存大小限定(见上文,基于容量回收)。使用软引用值的缓存同样用==而不是equals比较值。暂不理解
    refreshAfterWrite()缓存在设定时间内被 写创建/修改) 则刷新属性值配合 CacheLoader回调使用(必须)

    cache Api:

    API说明备注
    getIfPresent()通过key获取缓存中的value,若不存在直接返回null
    get()通过key获取缓存中的value,若不存在就通过valueLoader来加载该valuevalueLoader要么返回非null值,要么抛出异常,绝对不能返回null
    put()添加缓存,若key存在,就覆盖旧值
    invalidate()删除该key关联的缓存
    cleanUp()执行一些维护操作,包括清理缓存

    统计特性使用-- 统计信息对于调整缓存设置

    1. CacheBuilder.recordStats()用来开启Guava Cache的统计功能

    2. cache方法调用

      • stats()方法会返回CacheStats对象
      • hitRate():缓存命中率;
      • averageLoadPenalty():加载新值的平均时间,单位为纳秒;
      • evictionCount():缓存项被回收的总数,不包括显式清除。

    // todo

    1. ConcurrentHashMap 了解
    2. Cache实现类的差异性
    展开全文
  • 顾名思义文件缓存转内存缓存就是将存储在文件中的数据转到内存中去,实现磁盘操作转为内存操作,这样可以大大提高数据访问速度,并能实现缓存数据的分布式部署。文件缓存与内存缓存的介绍请参考名词解释部分
  • 当你取到图片的元数据,会将数据存入硬盘缓存以及内存缓存中。 数据的获取 取数据的时候,先从内存缓存中取; 如果没有取到,则从硬盘缓存中取(此时如果硬盘缓存有数据,硬盘缓存会重新将数据写入内存缓存中); ...
  • Glide-内存缓存与磁盘缓存

    万次阅读 热门讨论 2017-02-14 11:48:39
    前言:这一节我们将讲到Glide的内存缓存和磁盘缓存(网上流传的比较广的几篇文章都是直接从是一篇译文中拷贝过去的,那篇译文在许多地方都翻译错误了,其中很大的一个错误就是关于缓存一块的问题)Glide 系列目录 ...

    前言:

    这一节我们将讲到Glide的内存缓存和磁盘缓存

    (网上流传的比较广的几篇文章都是直接从是一篇译文中拷贝过去的,那篇译文在许多地方都翻译错误了,其中很大的一个错误就是关于缓存一块的问题)

    Glide 系列目录

    1.缓存的资源

    Glide的缓存资源分为两种:

    • 1.原图(SOURCE) :原始图片
    • 2.处理图(RESULT) :经过压缩和变形等处理后的图片

    2.内存缓存策略(skipMemoryCache)

    Glide默认是会在内存中缓存处理图(RESULT)的.

    可以通过调用skipMemoryCache(true)来设置跳过内存缓存

        //跳过内存缓存
        Glide.with(this).load(mUrl).skipMemoryCache(true).into(mIv);
    

    调用skipMemoryCache(false)没有代码上的意义,因为Glide默认就是不跳过内存缓存的,但是显示调用这个方法,可以让别人一目了然的知道你这次请求是会在内存中缓存的,所以还是建议显示调用一下这个方法来表明你的内存缓存策略

    3.磁盘缓存策略(diskCacheStrategy)

    Glide磁盘缓存策略分为四种,默认的是RESULT(默认值这一点网上很多文章都写错了,但是这一点很重要):

    • 1.ALL:缓存原图(SOURCE)和处理图(RESULT)

    • 2.NONE:什么都不缓存

    • 3.SOURCE:只缓存原图(SOURCE)

    • 4.RESULT:只缓存处理图(RESULT) —默认值

    4.组合策略

    和其他三级缓存一样,Glide的缓存读取顺序是 内存–>磁盘–>网络

    需要注意的是Glide的内存缓存和磁盘缓存的配置相互没有直接影响,所以可以同时进行配置

    例:

    1.内存不缓存,磁盘缓存缓存所有图片

    Glide.with(this).load(mUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(mIv);
    

    2.内存缓存处理图,磁盘缓存原图

    Glide.with(this).load(mUrl).skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(mIv);
    

    5.缓存大小及路径

    5.1内存缓存最大空间

    Glide的内存缓存其实涉及到比较多的计算,这里就介绍最重要的一个参数,就是内存缓存最大空间

    内存缓存最大空间(maxSize)=每个进程可用的最大内存 * 0.4

    (低配手机的话是: 每个进程可用的最大内存 * 0.33)

    5.2磁盘缓存大小

    磁盘缓存大小: 250 * 1024 * 1024(250MB)

    /** 250 MB of cache. */
        int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
    

    5.3磁盘缓存目录

    磁盘缓存目录: 项目/cache/image_manager_disk_cache

        String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
    

    6.清除缓存

    6.1清除所有缓存

    清除所有内存缓存(需要在Ui线程操作)

    Glide.get(this).clearMemory();
    

    清除所有磁盘缓存(需要在子线程操作)

    Glide.get(MainActivity.this).clearDiskCache();
    

    注:在使用中的资源不会被清除

    6.2清除单个缓存

    由于Glide可能会缓存一张图片的多个分辨率的图片,并且文件名是被哈希过的,所以并不能很好的删除单个资源的缓存,以下是官方文档中的描述

    Because File names are hashed keys, there is no good way to simply delete all of the cached files on disk that
    correspond to a particular url or file path. The problem would be simpler if you were only ever allowed to load
    or cache the original image, but since Glide also caches thumbnails and provides various transformations, each
    of which will result in a new File in the cache, tracking down and deleting every cached version of an image 
    is difficult.
    
    In practice, the best way to invalidate a cache file is to change your identifier when the content changes 
    (url, uri, file path etc).
    
    展开全文
  • 内存缓存和LruCache

    万次阅读 2016-12-21 22:01:59
    三级缓存之内存缓存三级缓存 内存缓存, 优先加载, 速度最快 本地缓存, 次优先加载, 速度快 网络缓存, 不优先加载, 速度慢,浪费流量 我们需要知道: Android默认给每个app只分配16M的内存 无论手机的内存多大,既然是...

    三级缓存之内存缓存

    三级缓存

    • 内存缓存, 优先加载, 速度最快
    • 本地缓存, 次优先加载, 速度快
    • 网络缓存, 不优先加载, 速度慢,浪费流量

    我们需要知道: Android默认给每个app只分配16M的内存 无论手机的内存多大,既然是默认,可能不同的手机,厂家给分配的也不同,
    我们可以通过Runtime.getRuntime().maxMemory()来动态获取.

    理解内存中的缓存先要知道java中的引用,Java中有四种引用
    - **java中的引用
    - 强引用 垃圾回收器不会回收, java默认引用都是强引用
    - 软引用 SoftReference 在内存不够时,垃圾回收器会考虑回收
    - 弱引用 WeakReference 在内存不够时,垃圾回收器会优先回收
    - 虚引用 PhantomReference 在内存不够时,垃圾回收器最优先回收**

    我们需要知道:安卓2.3+以后会提前回收软引用,即使内存够用.

    现在我们写一个简单的内存缓存

    public class MemoryCacheUtils {
    
        private static HashMap<String, Bitmap> mMemoryCache = new HashMap<String, Bitmap>();
    
        public static Bitmap getBitmap(String key) {
            return mMemoryCache.get(key);
        }
    
        public static void setBitmap(String key, Bitmap bitmap) {
            mMemoryCache.put(key, bitmap);
        }
    }

    现在我们知道Android默认给每个app只分配16M的内存,如果使用这个map一直进行内存缓存的话,
    肯定会发生内存溢出,因为你一直没有释放这些资源.你可能会问我们不是有垃圾回收机制吗? 垃圾回收机制只会回收没有引用的对象,也不是及时回收的.
    其实我们这些引用也是强引用,垃圾回收机制任何时候都不会回收这些对象的.

    刚才说了安卓2.3+以后会提前回收软引用,即使内存够用.现在对强引用进行一次包装,把他包装成软引用,这样及时内存够用也会及时回收这些软引用的.

    public class MemoryCacheUtils {
    
        private static HashMap<String, SoftReference<Bitmap>> mMemoryCache = new HashMap<String, SoftReference<Bitmap>>();
    
        public static Bitmap getBitmap(String key) {
            SoftReference<Bitmap> softReference = mMemoryCache.get(key);
            if (softReference != null) {//有时候 被回收掉会是空的,进行一次非空判断
                return softReference.get();
            }
            return null;
        }
    
        public static void setBitmap(String key, Bitmap bitmap) {
            SoftReference<Bitmap> softReference = new SoftReference<>(bitmap);
            mMemoryCache.put(key, softReference);
        }
    
    }
    但是新的问题也出现了. **软引用是解决内存溢出非常好的一种手段**,但是我们的目的是进行内存缓存,这样进行包装以后垃圾回收机制会很快的把这些软引用给回收掉,这样内存溢出的问题是解决了但是我们缓存的问题还没有得到解决  
    
        在过去,我们经常会使用一种非常流行的内存缓存技术的实现,
        即软引用或弱引用 (SoftReference or WeakReference)。
        但是现在已经不再推荐使用这种方式了,
        因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,
        这让软引用和弱引用变得不再可靠。另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,
        这就有潜在的风险造成应用程序的内存溢出并崩溃。
                                                --  ------以上是摘自谷歌官方文档翻译
    

    现在谷歌推荐使用LruCache

    **least recentlly use 最少最近使用算法**
    
    会将内存控制在一定的大小内, 超出最大值时会自动回收, 这个最大值开发者自己定
    

    现在我们使用一下,体验一下它的强大之处.

    public class MemoryCacheUtils {
    
        static LruCache<String, Bitmap> cache = null;//可以当做Map来使用
    
        static {
            long maxMemory = Runtime.getRuntime().maxMemory();
            System.out.println("手机的最大内存 : " + maxMemory);
            cache = new LruCache<String, Bitmap>((int) (maxMemory / 8)) {//指定要占用的最大内存
    
            //需要重写 ,默认返回一个字节
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    //返回当前储存照片所需的内存   照片所需内存只与显示所占的像素点有关系,与原图片的大小无关系
                    //return value.getByteCount()  //返回这个即可 下面返回是为了版本的兼容
                    return value.getRowBytes() * value.getHeight();//行像素点*高 = 照片所占内存
                }
            };//一般取最大内存的八分之一
        }
    
        public static Bitmap getBitmap(String key) {
            return cache.get(key);
        }
    
        public static void setBitmap(String key, Bitmap bitmap) {
            cache.put(key, bitmap);
        }
    
    }
    展开全文
  • iOS 内存缓存和磁盘缓存

    千次阅读 2017-02-26 12:48:59
    在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力。 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化。

    在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力。 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化。常见的内存缓存框架有NSCache、TMMemoryCachePINMemoryCacheYYMemoryCache。常见的磁盘缓框架存有TMDiskCache、PINDiskCache、YYCache.

    应用需要离线工作的主要原因就是改善应用所表现出的性能。将应用内容缓存起来就可以支持离线。我们可以用两种不同的缓存来使应用离线工作。第一种是**按需缓存**,这种情况下应用缓存起请求应答,就和Web浏览器的工作原理一样;第二种是**预缓存**,这种情况是缓存全部内容(或者最近n条记录)以便离线访问。
    我们可以理解为按需缓存一般是缓存在内存中的,而预缓存是缓存在磁盘中。

    缓存的策略:

    上一节中讨论到按需缓存和预缓存,它们在设计和实现上有很大的不同。按需缓存是指把从服务器获取的内容以某种格式存放在本地文件系统,之后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过期)的情况下才从服务器获取。这样的话,缓存层就和处理器的高速缓存差不多。获取数据的速度比数据本身重要。而预缓存是把内容放在本地以备将来访问。对预缓存来说,数据丢失或者缓存不命中是不可接受的,比方用户下载了文章准备在地铁上看,但却发现设备上不存在这些文章。

    像Twitter、Facebook这样的应用属于按需缓存,而腾讯视频的视频下载等则属于预缓存。

    实现预缓存可能需要一个后台线程访问数据并以有意义的格式保存,以便本地缓存无需重新连接服务器即可被编辑。编辑可能是“标记记录为已读”或“加入收藏”,或其他类似的操作。这里**有意义的格式**是指可以用这种方式保存内容,不用和服务器通信就可以在本地作出上面提到的修改,并且一旦再次连上网就可以把变更发送回服务器。

    按需缓存工作原理类似于浏览器缓存。它允许我们查看以前查看或者访问过的内容。按需缓存可以通过在打开一个视图控制器时按需地缓存数据模型(创建一个数据模型缓存)来实现,而不是在一个后台线程上做这件事。也可以在一个URL请求返回成功(200 OK)应答时实现按需缓存(创建一个URL缓存)。

    选择使用按需缓存还是预缓存的一个简便方法是判断是否需要在下载数据之后处理数据。后期处理数据可能是以用户产生编辑的形式,也可能是更新下载的数据,比如重写HTML页面里的图片链接以指向本地缓存图片。如果一个应用需要做上面提到的任何后期处理,就必须实现预缓存。

    存储缓存:

    第三方应用只能把信息保存在应用程序的沙盒中。因为缓存数据不是用户产生的,所以它应该被保存在NSCachesDirectory,而不是NSDocumentsDirectory。为缓存数据创建独立目录是一项不错的实践,通常在Library/caches文件夹下创建子文件夹。MyAppCache的目录。

    把缓存存储在缓存文件夹下的原因是iCloud(和iTunes)的备份不包括此目录。如果在Documents目录下创建了大尺寸的缓存文件,它们会在备份的时候被上传到iCloud并且很快就用完有限的空间(写作本书时大约为5 GB)。你不会这么干的——谁不想成为用户iPhone上的良民?NSCachesDirectory正是解决这个问题的。

    预缓存是用高级数据库(比如原始的SQLite)或者对象序列化框架(比如Core Data)实现的。

    展开全文
  • Java中缓存之内存缓存

    万次阅读 2016-04-08 17:04:05
    Java中缓存之内存缓存 1.缓存为什么要存在  应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的。如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘...
  • Glide 缓存策略 内存缓存和磁盘缓存

    千次阅读 2017-07-02 22:20:10
    Glide 缓存策略 内存缓存和磁盘缓存 官方文档:https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation 本文主要介绍了如何配置和管理Glide中的缓存,其中大部分内容都可以直接在...
  • 缓存分为内存缓存和硬盘缓存
  • 内存缓存 高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM...
  • iOS开发之内存缓存 磁盘缓存 沙盒

    千次阅读 2017-08-18 16:21:56
     说到缓存,缓存分为内存缓存和磁盘缓存两种,内存是指当前程序的运行空间,磁盘是程序的存储空间; 内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化;内存是临时存储文件用的,供CPU直接读取,比如说打开一个...
  • Android内存缓存:手把手教你学会LrhCache算法

    千次阅读 多人点赞 2018-09-06 08:52:26
    内存缓存知识在Android开发中实现重要 本文将全面介绍内存缓存的所有相关知识(含LrhCache算法、其原理等),希望您们会喜欢 目录 1. 简介 下面,将详细介绍 LrhCache算法 2. LrhCache算法 ...
  • glide内存缓存机制

    千次阅读 2019-08-02 14:02:54
    1)首先Glide内存缓存采用了2种策略,弱引用缓存和LRU算法内存缓存(2)弱引用缓存就是把图片的弱引用缓存在一个HashMap中,被下载使用的图片首先会缓存在这个弱引用HashMap中。Glide会通过引用计数的方式来记录图片...
  • 磁盘缓存和内存缓存的区别

    万次阅读 多人点赞 2015-08-23 22:49:50
    内存缓存高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM...
  • Android Glide数据更新及内存缓存、硬盘缓存清理事项Android的Glide在加载图片时候内部默认使用了缓存机制,Glide的缓存机制分为两级,第一级是内存缓存,然后第二级是硬盘缓存。缓存的过程首先是在内存中缓存,然后...
  • iOS开发之缓存(一):内存缓存 iOS内存缓存和磁盘缓存的区别 iOS开发之内存缓存 磁盘缓存 沙盒
  • Android RxJava应用:从磁盘/内存缓存中获取缓存数据

    万次阅读 多人点赞 2017-11-06 10:49:18
    前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章...今天,我将为大家带来 Rxjava中的常见开发应用场景:从磁盘、内存缓存中获取缓
  • MemoryCache内存缓存类讲解使用SoftReference做的内存缓存类文件缓存类FileCache讲解 MemoryCache内存缓存类讲解 内存缓存即把数据保存在内存中,如果缓存的数据超过设定的内存限制就删除最先缓存进来的数据...
  • Linux内存缓存解读

    千次阅读 2018-01-06 11:17:09
    Linux内存缓存解读 在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统...
  • 使用google guava做内存缓存

    千次阅读 2016-05-18 16:59:25
    google guava中有cache包,此包提供内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西guava都考虑到了。 guava中使用...
  • 缓存在应用中是必不可少的,经常用的如redis、memcache以及内存缓存等。Guava是Google出的一个工具包,它里面的cache即是对本地内存缓存的一种实现,支持多种缓存过期策略。 Guava cache的缓存加载方式有两种: ...
  • 内存缓存策略探析

    千次阅读 2012-11-04 15:00:20
    我在《性能调优思考》一文中粗略的谈到了有关于内存缓存。这里我再另开一文并结合我自己写的一个例子来谈谈有关于内存缓存。   内存缓存的用途场景会比较多,其实这里结合计算机硬件分层的思想从高级缓存,主存再到...
  • 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化。常见的内存缓存有NSCache、TMMemoryCache、PINMemoryCache、YYMemoryCache。常见的磁盘缓存有TMDiskCache、...
  • Java三个类实现内存缓存

    万次阅读 2016-08-06 14:51:21
    有一个需求,本来打算用redis来做,但是发现redis的list不支持某一项超时设置, 所以就用java自己写了一个简单的缓存,操作类似redis,总共只有3...简单的内存缓存实现,实现group概念,一个group里面是个有序的集合,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 949,693
精华内容 379,877
关键字:

内存缓存