聊一聊缓存 [from memory cache 和 from disk cache]

聊一聊缓存 [from memory cache 和 from disk cache],第1张

现在简单的来分析一下,首先,大家可以想一下,浏览器的缓存存放在哪里,如何在浏览器中判断强制缓存是否生效?

先看一下这张图

会发现在浏览器开发者工具的Network的Size栏会出现的三种情况:

状态码及区别:

from memory cache(内存中的缓存): 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。

from disk cache(是硬盘中的缓存): 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。

304 Not Modified: 访问服务器,发现数据没有更新,服务器返回此状态码。然后从缓存中读取数据。

在浏览器中,浏览器会在js和等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

内存缓存(from memory cache)和硬盘缓存(from disk cache)特点

(1)内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:

1、快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。

2、时效性:一旦该进程关闭,则该进程的内存则会清空。

(2)硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O *** 作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

缓存原理

1、先查找内存,如果内存中存在,从内存中加载;

2、如果内存中未查找到,选择硬盘获取,如果硬盘中有,从硬盘中加载;

3、如果硬盘中未查找到,那就进行网络请求;

4、加载到的资源缓存到硬盘和内存;

执行顺序

现加载一种资源(例如:):

访问-> 200 -> 退出浏览器

重新进来-> 200(from disk cache) -> 刷新 -> 200(from memory cache)

附一张流程图梳理一下

先用输入流InputStream将文件内容读取到字节数组(长度为 1024)中,再用输出流OutputStream将字节数组中的数据写到目标设备

public void write(byte[] buffer, int offset, int count)

该方法第一个参数为:字节数组

第二个是:要写入的数据在数组中的起始位置 即:0

第三个是:写入的长度,即:1024

第一章 常用的缓存技术

1、常见的两种缓存

本地缓存:不需要序列化,速度快,缓存的数量与大小受限于本机内存

分布式缓存:需要序列化,速度相较于本地缓存较慢,但是理论上缓存的数量与大小无限(因为缓存机器可以不断扩展)

2、本地缓存

Google guava cache:当下最好用的本地缓存

Ehcache:spring默认集成的一个缓存,以spring cache的底层缓存实现类形式去 *** 作缓存的话,非常方便,但是欠缺灵活,如果想要灵活使用,还是要单独使用Ehcache

Oscache:最经典简单的页面缓存

3、分布式缓存

memcached:分布式缓存的标配

Redis:新一代的分布式缓存,有替代memcached的趋势

31、memcached

经典的一致性hash算法

基于slab的内存模型有效防止内存碎片的产生(但同时也需要估计好启动参数,否则会浪费很多的内存)

集群中机器之间互不通信(相较于Jboss cache等集群中机器之间的相互通信的缓存,速度更快<--因为少了同步更新缓存的开销,且更适合于大型分布式系统中使用)

使用方便(这一点是相较于Redis在构建客户端的时候而言的,尽管redis的使用也不困难)

很专一(专做缓存,这一点也是相较于Redis而言的)

32、Redis

可以存储复杂的数据结构(5种)

strings-->即简单的key-value,就是memcached可以存储的唯一的一种形式,接下来的四种是memcached不能直接存储的四种格式(当然理论上可以先将下面的一些数据结构中的东西封装成对象,然后存入memcached,但是不推荐将大对象存入memcached,因为memcached的单一value的最大存储为1M,可能即使采用了压缩算法也不够,即使够,可能存取的效率也不高,而redis的value最大为1G)

hashs-->看做hashTable

lists-->看做LinkedList

sets-->看做hashSet,事实上底层是一个hashTable

sorted sets-->底层是一个skipList

有两种方式可以对缓存数据进行持久化

RDB

AOF

事件调度

发布订阅等

4、集成缓存

专指spring cache,spring cache自己继承了ehcache作为了缓存的实现类,我们也可以使用guava cache、memcached、redis自己来实现spring cache的底层。当然,spring cache可以根据实现类来将缓存存在本地还是存在远程机器上。

5、页面缓存

在使用jsp的时候,我们会将一些复杂的页面使用Oscache进行页面缓存,使用非常简单,就是几个标签的事儿;但是,现在一般的企业,前台都会使用velocity、freemaker这两种模板引擎,本身速度就已经很快了,页面缓存使用的也就很少了。

总结:

在实际生产中,我们通常会使用guava cache做本地缓存+redis做分布式缓存+spring cache就集成缓存(底层使用redis来实现)的形式

guava cache使用在更快的获取缓存数据,同时缓存的数据量并不大的情况

spring cache集成缓存是为了简单便捷的去使用缓存(以注解的方式即可),使用redis做其实现类是为了可以存更多的数据在机器上

redis缓存单独使用是为了弥补spring cache集成缓存的不灵活

就我个人而言,如果需要使用分布式缓存,那么首先redis是必选的,因为在实际开发中,我们会缓存各种各样的数据类型,在使用了redis的同时,memcached就完全可以舍弃了,但是现在还有很多公司在同时使用memcached和redis两种缓存。

二级缓存工作机制

所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存)。注意:内存缓存会造成堆内存泄露,所有一级缓存通常要严格控制缓存的大小,一般控制在系统内存的1/4。

理解了二级缓存大家可能会有个问题网络中的数据是变化的,数据一旦放入缓存中,再取该数据就是从缓存中获得,这样岂不是不能体现数据的变化?我们在缓存数据时会设置有效时间,比如说30分钟,若超过这个时间数据就失效并释放空间,然后重新请求网络中的数据。有的童鞋就问30分钟内咋办?那好吧,我也没招了,只有下拉刷新了, 实际上这不是问题。

二级缓存的实现

如何实现二级缓存,有很多技术方案,在这里我们使用 ASimpleCache框架来给大家演示一下,通过名字就可以看出它是很容易实现的。

1、ACache介绍

ASimpleCache是一个轻量级的开源cache框架,实际上就是一个叫ACache的java类。已经在商业项目中使用,运行效果不错。

2、ACache使用

我们先做一个实现数据缓存的案例,然后再归纳一下主要的方法

编写NewsListActivity主要代码如下:

创建ACache组件

ACache acache=ACacheget(context)

ACache acache=ACacheget(context,max_size,max_count)

参数说明:

max_size:设置限制缓存大小,默认为50M

max_count:设置缓存数据的数量,默认不限制

设置缓存数据

acacheput(key,data,time)或acacheput(key,data)

将数据同时上存入一级缓存(内存Map)和二级缓存(文件)中

参数说明:

Key:为存入缓存的数据设置唯一标识,取数据时就根据key来获得的

Data:要存入的数据,acache支持的数据类型如图所示:

有String、可序列化的对象、字节数组、Drawable等Time:设置缓存数据的有效时间,单位秒

从缓存中取数据

提供一系列getAsXXX()方法,如图所示。

根据不同存入数据,调用不同的方法取数据

以上就是关于聊一聊缓存 [from memory cache 和 from disk cache]全部的内容,包括:聊一聊缓存 [from memory cache 和 from disk cache]、Java socket接收缓存中多行数据数据的读取问题、常用的缓存技术等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9408739.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存