Java实现简单的缓存机制原理

Python014

Java实现简单的缓存机制原理,第1张

package qinbo hui

/*

设计思想来自-回钦波(qq: )

*/

public class CacheConfModel implements java io Serializable{

private long beginTime

private boolean isForever = false

private int durableTime

public long getBeginTime() {

return beginTime

}

public void setBeginTime(long beginTime) {

this beginTime = beginTime

}

public boolean isForever() {

return isForever

}

public void setForever(boolean isForever) {

this isForever = isForever

}

public int getDurableTime() {

return durableTime

}

public void setDurableTime(int durableTime) {

this durableTime = durableTime

}

}

package qinbo hui

import java util *

import test CacheConfModel

/*

设计思想来自-回钦波(qq: )

*/

public class CacheMgr {

private static Map cacheMap = new HashMap()

private static Map cacheConfMap = new HashMap()

private CacheMgr(){

}

private static CacheMgr cm = null

public static CacheMgr getInstance(){

if(cm==null){

cm = new CacheMgr()

Thread t = new ClearCache()

t start()

}

return cm

}

/**

* 增加缓存

* @param key

* @param value

* @param ccm 缓存对象

* @return

*/

public  boolean addCache(Object key Object value CacheConfModel ccm){

boolean flag = false

cacheMap put(key value)

cacheConfMap put(key ccm)

System out println( now addcache== +cacheMap size())

return true

}

/**

* 删除缓存

* @param key

* @return

*/

public  boolean removeCache(Object key){

cacheMap remove(key)

cacheConfMap remove(key)

System out println( now removeCache== +cacheMap size())

return true

}

/**

* 清除缓存的类

* @author wanglj

* 继承Thread线程类

*/

private static class ClearCache extends Thread{

public void run(){

while(true){

Set tempSet = new HashSet()

Set set = cacheConfMap keySet()

Iterator it = erator()

while(it hasNext()){

Object key = it next()

CacheConfModel ccm = (CacheConfModel)cacheConfMap get(key)

//比较是否需要清除

if(!ccm isForever()){

if((new Date() getTime() ccm getBeginTime())>= ccm getDurableTime()* * ){

//可以清除 先记录下来

tempSet add(key)

}

}

}

//真正清除

Iterator tempIt = erator()

while(tempIt hasNext()){

Object key = tempIt next()

cacheMap remove(key)

cacheConfMap remove(key)

}

System out println( now thread================>+cacheMap size())

//休息

try {

Thread sleep( * L)

} catch (InterruptedException e) {

// TODO Auto generated catch block

e printStackTrace()

}

}

}

}

lishixinzhi/Article/program/Java/hx/201311/25737

缓存功能的存在,让我们在浏览网页和访问防止的时候可以更快的加载我们需要的内容,而今天北大青鸟http://www.kmbdqn.cn/就通过案例分析来了解一下,浏览器的缓存功能在使用上都有哪些类型。

1.ServiceWorkerServiceWorker是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。

使用ServiceWorker的话,传输协议必须为HTTPS。

因为ServiceWorker中涉及到请求拦截,所以必须使用HTTPS协议来保障安全。

ServiceWorker的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。

ServiceWorker实现缓存功能一般分为三个步骤:先需要先注册ServiceWorker,然后监听到install事件以后就可以缓存需要的文件,那么在下次用户访问的时候就可以通过拦截请求的方式查询是否存在缓存,存在缓存的话就可以直接读取缓存文件,否则就去请求数据。

当ServiceWorker没有命中缓存的时候,我们需要去调用fetch函数获取数据。

也就是说,如果我们没有在ServiceWorker命中缓存的话,会根据缓存查找优先级去查找数据。

但是不管我们是从MemoryCache中还是从网络请求中获取的数据,浏览器都会显示我们是从ServiceWorker中获取的内容。

2.MemoryCacheMemoryCache也就是内存中的缓存,主要包含的是当前中页面中已经抓取到的资源,例如页面上已经下载的样式、脚本、图片等。

读取内存中的数据肯定比磁盘快,内存缓存虽然读取高效,可是缓存持续性很短,会随着进程的释放而释放。

一旦我们关闭Tab页面,内存中的缓存也就被释放了。

那么既然内存缓存这么高效,我们是不是能让数据都存放在内存中呢?这是不可能的。

计算机中的内存一定比硬盘容量小得多,操作系统需要精打细算内存的使用,所以能让我们使用的内存必然不多。

java有自己的缓存输入输出类,比如 InputStream,FileOutputStram等 具体可以查看API,

要想自己实现的话,很简单,设置一个足够大的字节数组就可以了,把需要的东西放进去,就是个缓存。