精华内容
下载资源
问答
  • 内存缓存和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);
        }
    
    }
    展开全文
  • Glide 缓存策略 内存缓存和磁盘缓存

    千次阅读 2017-06-30 13:37:20
    言归正传,Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。 磁盘缓存 一般的图片缓存指的就是磁盘缓存,把网络上的图片缓存到本地,这样就不需要每次都从网络加载...
    本文主要介绍了如何配置和管理Glide中的缓存,其中大部分内容都可以直接在官方Wiki中找到,这里只是进行了整理和汇总。言归正传,Glide支持图片的二级缓存(并不是三级缓存,因为从网络加载并不属于缓存),即内存缓存和磁盘缓存。

    磁盘缓存

    一般的图片缓存指的就是磁盘缓存,把网络上的图片缓存到本地,这样就不需要每次都从网络加载,既提高了加载速度,又为用户节省了流量。
    Glide在默认情况下是开启磁盘缓存的,而且提供了丰富的API来让开发者自己配置和管理磁盘缓存。

    缓存位置和大小
    开发者可以通过构建一个自定义的GlideModule来配置Glide磁盘缓存的位置和大小。最简单的方法如下:
    1. public class DiskCacheMoudle implements GlideModule {
    2.     @Override
    3.     public void applyOptions(Context context, GlideBuilder builder) {
    4.         builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));
    5.         //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));
    6.     }
    7.     @Override
    8.     public void registerComponents(Context context, Glide glide) {
    9.     }
    10. }
    其中第二个参数为缓存的目录名称,第三个参数为缓存大小,单位是Byte。
    InternalCache构建的缓存是在应用的内部储存,而ExternalCache则是在外部储存。

    如果不想把缓存放在上面的两个位置怎么办?Glide当然也支持,具体通过DiskLruCacheFactory来实现:
    1. builder.setDiskCache(
    2.                 new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
    3.                     @Override
    4.                     public File getCacheDirectory() {
    5.                         return getMyCacheLocationBlockingIO();
    6.                     }
    7.                 }), 100 * 1024 * 1024);
    Note: getMyCacheLocationBlockingIO方法返回的文件不能为空,而且必须是一个已经创建好的文件目录,不可以是文件。

    磁盘缓存策略

    与其他图片加载库的缓存机制不同,Glide缓存图片时默认只缓存最终加载的那张图片。举个栗子,你要加载的图片分辨率为1000x1000,但是最终显示该图片的ImageView大小只有500x500,那么Glide就会只缓存500x500的小图。这也是在从磁盘缓存中加载图片时Glide比Picasso快的原因。

    不过,你可以改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸:
    1. Glide.diskCacheStrategy(DiskCacheStrategy.ALL)

    Glide目前提供了四种缓存策略:
    • DiskCacheStrategy.NONE  不缓存文件
    • DiskCacheStrategy.SOURCE  只缓存原图
    • DiskCacheStrategy.RESULT  只缓存最终加载的图(默认的缓存策略)
    • DiskCacheStrategy.ALL  同时缓存原图和结果图

    磁盘缓存算法

    在Glide中磁盘缓存默认使用的是LRU(Least Recently Used)算法。如果你想使用其他的缓存算法,就只能通过实现DiskCache接口来完成了。

    内存缓存

    使用内存缓存可以获得更快的图片加载速度,因为减少了耗时的IO操作。众所周知,Bitmap是Android中的内存大户,频繁的创建和回收Bitmap必然会引起内存抖动。Glide中有一个叫做BitmapPool的类,可以复用其中的Bitmap对象,从而避免Bitmap对象的创建,减小内存开销。

    当配置内存缓存时,我们也应该同时配置BitmapPool的大小。具体方法也是通过自定义的GlideModule来实现的:
    1. builder.setMemoryCache(new LruResourceCache(yourSizeInBytes));
    2. builder.setBitmapPool(new LruBitmapPool(sizeInBytes));

    一般情况下,开发者是不需要自己去指定它们的大小的,因为Glide已经帮我们做好了。默认的内存缓存和BitmapPool的大小由MemorySizeCalculator根据当前设备的屏幕大小和可用内存计算得到。同时Glide还支持动态的缓存大小调整,在存在大量图片的Activity/Fragment中,开发者可以通过setMemoryCategory方法来提高Glide的内存缓存大小,从而加快图片的加载速度。
    1. Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);

    MemoryCategory有3个值可供选择:
    • MemoryCategory.HIGH(初始缓存大小的1.5倍)
    • MemoryCategory.NORMAL(初始缓存大小的1倍)
    • MemoryCategory.LOW(初始缓存大小的0.5倍)

    在有些情况下我们不希望做内存缓存(比如加载GIF图片),这个时候可以调用skipMemoryCache(true)方法跳过内存缓存。

    如何缓存动态URL的图片

    一般情况下我们从网络上获取到的图片Url都是静态的,即一张图片对应一个Url。那么如果是一张图片对应多个Url呢?缓存不就没有意义了。因为图片加载库都是拿图片的Url来作为缓存的key的,Glide也不例外,只是会更加复杂一些。如果你开启了Glide的log,就会在控制台看到Glide是如何指定缓存key的。一般来说,Glide的key由图片的url、view的宽和高、屏幕的尺寸大小和signature组成。

    在什么情况下才会出现动态的Url呢?一个很典型的例子就是因为图片的安全问题在原来图片的Url后面加上访问凭证。访问凭证与时间关联,这样一来,在不同时间同一图片的Url就会不同,缓存就会失效。以七牛的私有空间为例,我们来看看如何去缓存这类图片。从七牛关于私有空间的文档中可以得到:最终的Url = 原Url + ?e=过期时间 + token=下载凭证。那么就只需要在Glide缓存时将Url中“?”后面的字符串截去就可以了。

    首先新建一个叫做QiNiuImage的类:
    1. public class QiNiuImage {
    2.     private final String imageUrl;
    3.     public QiNiuImage(String imageUrl) {
    4.         this.imageUrl = imageUrl;
    5.     }
    6.     public String getImageUrl() {
    7.         return imageUrl;
    8.     }
    9.     public String getImageId() {
    10.         if (imageUrl.contains("?")) {
    11.             return imageUrl.substring(0, imageUrl.lastIndexOf("?"));
    12.         } else {
    13.             return imageUrl;
    14.         }
    15.     }
    16. }
    其中getImageUrl方法返回真实的Url,getImageId方法返回未添加下载凭证前的Url。

    然后再自定义一个实现ModelLoader接口的QiNiuImageLoader:
    1. public class QiNiuImageLoader implements StreamModelLoader<QiNiuImage> {
    2.     @Override
    3.     public DataFetcher<InputStream> getResourceFetcher(final QiNiuImage model, int width, int height) {
    4.         return new HttpUrlFetcher(new GlideUrl(model.getImageUrl())) {
    5.             @Override
    6.             public String getId() {
    7.                 return model.getImageId();
    8.             }
    9.         };
    10.     }
    11.     public static class Factory implements ModelLoaderFactory<QiNiuImage, InputStream> {
    12.         @Override
    13.         public ModelLoader<QiNiuImage, InputStream> build(Context context, GenericLoaderFactory factories) {
    14.             return new QiNiuImageLoader();
    15.         }
    16.         @Override
    17.         public void teardown() { /* no op */ }
    18.     }
    19. }

    其中HttpUrlFetcher的getId方法就是组成缓存的key的重要部分。这也是我们的核心原理。

    将这个ModelLoader注册到GlideModule中,并在AndroidManifest.xml中注册:
    1. public class QiNiuModule implements GlideModule {
    2.     @Override
    3.     public void applyOptions(Context context, GlideBuilder builder) {
    4.     }
    5.     @Override
    6.     public void registerComponents(Context context, Glide glide) {
    7.         glide.register(QiNiuImage.class, InputStream.class, new QiNiuImageLoader.Factory());
    8.     }
    9. }

    1. <meta-data
    2.         android:name="com.yourpackagename.QiNiuModule"
    3.         android:value="GlideModule"/>

    最后只需要在加载此类图片时,使用下面这段代码就可以了。即使图片的token更换了也不会重新从网络上下载而是直接读取本地缓存。
    1. Glide.with(context)
    2.       .load(new QiNiuImage(imageUrl)
    3.       .into(imageView);
    展开全文
  • 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)实现的。

    展开全文
  • 磁盘缓存和内存缓存的区别

    万次阅读 多人点赞 2015-08-23 22:49:50
    内存缓存高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM...

    内存缓存

    高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。

    原理
    Cache一词来源于1967年的一篇电子工程期刊论文。其作者将法语词“cache”赋予“safekeeping storage”的涵义,用于电脑工程领域。

    当CPU处理数据时,它会先到Cache中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从随机存取存储器(Main memory)中读取数据——由于CPU的运行速度一般比主内存的读取速度快,主存储器周期(访问主存储器所需要的时间)为数个时钟周期。因此若要访问主内存的话,就必须等待数个CPU周期从而造成浪费。

    提供“缓存”的目的是为了让数据访问的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局域性行为”,即一定程序执行时间和空间内,被访问的代码集中于一部分。为了充分发挥缓存的作用,不仅依靠“暂存刚刚访问过的数据”,还要使用硬件实现的指令预测与数据预取技术——尽可能把将要使用的数据预先从内存中取到缓存里。

    CPU的缓存曾经是用在超级计算机上的一种高级技术,不过现今电脑上使用的的AMD或Intel微处理器都在芯片内部集成了大小不等的数据缓存和指令缓存,通称为L1缓存(L1 Cache即Level 1 On-die Cache,第一级片上高速缓冲存储器);而比L1更大容量的L2缓存曾经被放在CPU外部(主板或者CPU接口卡上),但是现在已经成为CPU内部的标准组件;更昂贵的CPU会配备比L2缓存还要大的L3缓存(level 3 On-die Cache第三级高速缓冲存储器)。

    概念的扩充
    如今缓存的概念已被扩充,不仅在CPU和主内存之间有Cache,而且在内存和硬盘之间也有Cache(磁盘缓存),乃至在硬盘与网络之间也有某种意义上的Cache──称为Internet临时文件夹或网络内容缓存等。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为Cache。

    地址镜像与变换
    主条目:CPU缓存#组相联
    由于主存容量远大于CPU缓存的容量,因此两者之间就必须按一定的规则对应起来。地址镜像就是指按某种规则把主存块装入缓存中。地址变换是指当按某种镜像方式把主存块装入缓存后,每次访问CPU缓存时,如何把主存的物理地址(Physical address)或虚拟地址(Virtual address)变换成CPU缓存的地址,从而访问其中的数据。

    缓存置换策略
    主条目:CPU缓存#置换策略、分页和缓存文件置换机制
    主存容量远大于CPU缓存,磁盘容量远大于主存,因此无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容。解决这个问题的算法有几种,如最久未使用算法(LRU)、先进先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)等,这些算法在不同层次的缓存上执行时拥有不同的效率和代价,需根据具体场合选择最合适的一种。

    磁盘缓存

    磁盘缓存

    16MB缓冲区的硬盘
    磁盘缓存(Disk Buffer)或磁盘快取(Disk Cache)实际上是将下载到的数据先保存于系统为软件分配的内存空间中(这个内存空间被称之为“内存池”),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏。

    磁盘缓存是为了减少CPU透过I/O读取磁盘机的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速。

    相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。

    大小
    现在的磁盘通常有32MB或64MB缓存。旧的硬盘则有8MB或16MB。

    展开全文
  • 内存缓存

    千次阅读 2019-03-20 10:21:30
    内存缓存 什么时候用 愿意消耗一些内存空间来提升速度 预料某些数据会被查询多次以上 缓存中存放的数据不会超过内存容量(应用程序的本地缓存,不会把数据存储到文件或服务器上) 可用方式 Google Guava Cache ...
  • 发布时间:2014-12-25 15:20 分类:android开发基础 ...内存缓存即把数据保存在内存中,如果缓存的数据超过设定的内存限制就删除最先缓存进来的数据。下面的MemoryCache缓存类是先创建一个Map对象
  • Java中缓存内存缓存

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

    万次阅读 热门讨论 2017-02-14 11:48:39
    前言:这一节我们将讲到Glide的内存缓存和磁盘缓存(网上流传的比较广的几篇文章都是直接从是一篇译文中拷贝过去的,那篇译文在许多地方都翻译错误了,其中很大的一个错误就是关于缓存一块的问题)Glide 系列目录 ...
  • 缓存分为内存缓存和硬盘缓存
  • 内存缓存 高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM...
  • 缓存策略在移动端设备上是非常重要的,尤其是在图片加载这个场景下,因为图片相对而言比较大会花费用户较多的流量,因此可用缓存方式来解决,即当...但很多时候为了提高APP的用户体验,我们还需要把图片在内存缓存
  • 但数据库中有些数据是完全静态的或不太经常变动的,缓存系统会通过把SQL查询的结果缓存到一个更快的存储系统中存 储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且缓存查询结果也允许你后期处理
  • 缓存和内存的延迟

    千次阅读 2018-01-04 11:36:45
    来自java特种兵  一般来讲, 一级缓存与cpu的延迟一般在2~3ns之间 二级缓存通常在10~15ns, 三级缓存为20~30ns, 而内存通常会在50ns以上甚至更高。
  • 缓存的过程首先是在内存缓存,然后将加载的图片资源缓存到硬盘,这样就可以在随后的再次加载中使用缓存了,Glide使用缓存时候首先要检查内存这一层级是否缓存了相应的缓存,如果,则直接使用,如果没有,则
  • Android 内存缓存:手把手教你学会LrhCache算法

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

    万次阅读 多人点赞 2018-09-19 14:35:57
    一、缓存处理流程  前台请求,后台先从缓存中取数据... 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导...
  • 前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章...今天,我将为大家带来 Rxjava中的常见开发应用场景:从磁盘、内存缓存中获取缓
  • 使用google guava做内存缓存

    千次阅读 2016-05-18 16:59:25
    google guava中cache包,此包提供内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西guava都考虑到了。 guava中使用...
  • //获取字符串缓存 ViewBag.sbname = MemoryCacheService.GetCacheValue("sname"); //存入泛型列表 List<TsetModel> list = new List(); for (int i = 0; i ; i++) { TsetModel model = new TsetModel(); ...
  • cache-缓存和memory-内存

    千次阅读 2017-09-08 21:08:25
    缓存是在CPU与内存之间,是一个读写速度比内存更快的存储器。 当CPU向内存读取或写入数据时,这个数据也被存储进高速缓冲存储器(缓存)。 当CPU再次需要这些数据时,就从高速缓冲存储器(缓存)读取数据,而不是...
  • Linux内存缓存解读

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

    千次阅读 2018-01-03 10:04:03
    MySQL的查询缓存是完全存储在内存中,那么在配置使用之前,我们看看MySQL是如何使用内存的。 当服务器启动的时候,需要初始化查询缓存需要的内存。这时候内存池是一个完整的空闲块,而这个空闲块的大小就是...
  • 中间偷懒了,好久没有写博客了,今天写一下我研究了好几天的Android ListView 图片异步加载图片内存缓存。嘿嘿。  开发Android应用经常需要处理图片的加载问题。因为图片一般都是存放在服务器端,需要联网去...
  • Java三个类实现内存缓存

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

    千次阅读 2019-01-26 21:03:32
    CPU性能优化手段——缓存 为了提高程序运行的性能,...L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器的CPU的L1缓存的容量通常在32——4096KB。 L2 由于L1级高速缓存容量的限制...
  • Discuz! 内存缓存机制与使用方法

    千次阅读 2017-03-21 10:19:03
     缓存层的引入是为了解决MYSQL自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的Key-Value对形式,内存级的缓存产品很多,支持的内存优化接口 Memcache、eAccelerator、Alternative PHP Cache(APC)、Xcache...
  • 缓存和内存的区别

    万次阅读 多人点赞 2017-04-18 07:50:17
    许多人认为,“缓存”是内存的一部分  许多技术文章都是这样教授的  但是还是很多人不知道缓存在什么地方,缓存是做什么用的  其实,缓存是CPU的一部分,它存在于...缓存是为了解决CPU速度和内存速度的速度差异

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,258,098
精华内容 903,239
关键字:

内存缓存无缓存和有缓存