java缓存类的编码

这里我通过浏览一些其他博客写的缓存类编码,感觉不是很详细,要不然用不到程序上,要不然回事简单的说了下实现,这里我根据对其他缓存类的编码,总结了下,希望对你们有所帮助!

我总共写了1个接口,1个实现类,需要1个的缓存的实体类,1个测试类.

接口:public interface CacheManager<T>{ };用于缓存数据的相关操作,如清空,添加,查询,是否过期等等;

实现类:public class CacheManagerImpl<T> implements CacheManager<T> {} 用于实现接口相关的方法;

缓存的数据类:public class Cache<T>;缓存存放数据的类;

测试类:public class CacheTest extends Thread{ }用于测试你写的缓存;

如果用到项目上,通常key都是你搜所的sql语句,然后T是你存放查询到的数据内容而用于测试都是存放的String


下面是依次类的相关编码,内容:


/**
 * 实现缓存接口
 * @author rainjm 
 *
 */
public interface CacheManager<T> {

/**
* 获取缓存
* @param key
* @return T
*/
public T getCache(String key);

/**
* 存入缓存
* @param key
* @return T
*/
public void setCache(String key,T t);

/**
* 删除缓存
* @param key
* @return T
*/
public void deCache(String key);

/** 
     * 设置缓存过期时间 
     *  
     * @param millsec 缓存过期时间,单位:毫秒 
     */  
    public void setExpired(Long millsec); 
    
    /** 
     * 是否存在缓存对象 
     *  
     * @param key 缓存key 
     * @return 存在返回true,不存在返回false 
     */  
    public Boolean exist(String key);  
    
    /** 
     * 清空缓存 
     *  
     * @param key 缓存key 
     */  
    public void clern();
    
    /** 
     * 缓存个数 
     */  
    public int Count();
    
    /** 
     * 缓存限制 
     */  
    public void limit();
    
    /** 
     * 判断缓存对象是否失效 
     */  
    public Boolean check(String key);

}




import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;




public class CacheManagerImpl<T> implements CacheManager<T> {


private Long timecheck;//用于判断过期时间
private Map<String,Cache<T>> cache=new ConcurrentHashMap<String,Cache<T>>();//为什么用ConcurrentHashMap,可以去网上搜搜,了解一下



//自动为限制时间定制失效隔离时间,通过构造器
public CacheManagerImpl(Long timecheck) {
this.timecheck=timecheck;


}


public CacheManagerImpl() {

this(30000l);

}




public Long getTimecheck() {
return timecheck;
}


public void setTimecheck(Long timecheck) {
this.timecheck = timecheck;
}


        //接口类的相关实现方法
@Override
public T getCache(String key) {

if(!exist(key)){
return null;
}
return cache.get(key).getData();
}


@Override
public void setCache(String key,T t) {


if(exist(key)){
cache.remove(key);
}
   cache.put(key, new Cache<T>(t));
}


@Override
public void deCache(String key) {
cache.remove(key);

}
//手动为限制时间定制失效隔离时间 ,如果不满意自带的限制时间
@Override
public void setExpired(Long millsec) {
this.setTimecheck(millsec);

}


@Override
public Boolean exist(String key) {
return cache.containsKey(key);
}


@Override
public void clern() {
cache.clear();
}


@Override
public int Count() {
    
return cache.entrySet().size();
}


@Override
public void limit() {
List<String> list=new ArrayList<String>();
Iterator<Entry<String, Cache<T>>> ite = cache.entrySet().iterator();
while(ite.hasNext()){
Entry<String, Cache<T>> en = ite.next();
String key = en.getKey();
list.add(key);
}

for (int i = 0; i < list.size(); i++) {

if(check(list.get(i))){
cache.remove(list.get(i));
}
}


}


@Override
public Boolean check(String key) {
if(((new Date()).getTime()-cache.get(key).getDatatime())>this.timecheck){
return true;
}
return false;

}


}






import java.util.Date;

//存放缓存数据的类
public class Cache<T> {
private T data;//存放数据对象
private Long datatime;//每次更新缓存数据或创建时的更新时间、用于判断数据是否过期的依据


public Cache() {
    super();
}

      public Cache(T t) {
      this.data=t;
      this.datatime=new Date().getTime();
}


public T getData() {
return data;
}


public void setData(T data) {
this.data = data;
}


public Long getDatatime() {
return datatime;
}


public void setDatatime(Long datatime) {
this.datatime = datatime;
}

}






import java.util.Scanner;

//测试类  
public class CacheTest extends Thread{
protected static CacheManager<String> ca=new CacheManagerImpl<String>();//这里定义存放缓存数据的类型,我这里定义的是字符串;方面测试!
protected static Boolean check=true;
static {
//打开即开始一个线程,且只运行一次
(new CacheTest()).start();
}



public void Te(){
Scanner can=new Scanner(System.in);
System.out.println("1: 添加数据! 2:清空! 3:退出! 4:查询!"+"  当前连接数: "+ca.Count());

int key=can.nextInt();

if(key==1){
System.out.println("请你输入要添加的ID!");
String in=can.next();
System.out.println("请你输入要添加的数据!");
String ou=can.next();
ca.setCache(in, ou);
Te();
}
if(key==2){
ca.clern();
System.out.println("清除成功!");
Te();
}
if(key==3){
this.interrupt();
check=false;
System.out.println("稍后将自动退出线程!!");
}
if(key==4){
System.out.println("请你输入要查询的ID!");
String in=can.next();
String ab = ca.getCache(in);
if(ab==null){
System.out.println("暂无数据!!");
}else{
System.out.println("数据为: "+ab+ "   1:删除!  2返回" );
int de=can.nextInt();
if(de==1){
ca.deCache(in);
System.out.println("删除成功!");
}else {
Te();
}
}
Te();
}

}

@Override
public void run() {
while (check) {
try {
sleep(30000);
//自动检测过期的缓存数据。过期则自动清除,每30s检测一次
ca.limit();
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
public static void main(String[] args) {

CacheTest c=new CacheTest();
c.Te();

}


}


有什么问题,请留言!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl+C+V程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值