在java web 项目中对频繁读取且相对稳定的数据一般都是用了缓存,这样可以极大地减少数据库的压力且提高的响应的速度。 一般都是,通过key 从缓存中读取value 如果value 为空则读取DB,将DB读取的数据再放入缓存这样的一个过程。
一个简易的本地缓存实现。
首先数据一般都是有时效性的,不是放入缓存就一直存在,如果超过一定时间没有被使用则应当被清空,使其系统中不会使用到过期数据。
下面是对本地缓存的一种简单实现
首先定义一个缓存实体,包含三个属性 放入缓存的时间戳,值以及过期时间;其次需要个线程去监控缓存实体是否过期。
/** * * @author zhangwei_david * @version $Id: CacheEntity.java, v 0.1 2014年9月6日 下午2:07:00 Lenovo Exp $ */ /** *本地缓存保存的实体 * * @author Lenovo * @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:13:43 Lenovo Exp $ */ public class CacheEntity implements Serializable { /** */ private static final long serialVersionUID = 7172649826282703560L; /** * 值 */ private Object value; /** * 保存的时间戳 */ private long gmtModify; /** * 过期时间 */ private int expire; public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public long getGmtModify() { return gmtModify; } public void setGmtModify(long gmtModify) { this.gmtModify = gmtModify; } public int getExpire() { return expire; } public void setExpire(int expire) { this.expire = expire; } public CacheEntity(Object value, long gmtModify, int expire) { super(); this.value = value; this.gmtModify = gmtModify; this.expire = expire; } }
/** * 简易本地缓存的实现类 * @author zhangwei_david * @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:04:53 zhangwei_david Exp $ */ public class LocalCache { //默认的缓存容量 private static int DEFAULT_CAPACITY = 512; //最大容量 private static int MAX_CAPACITY = 100000; //刷新缓存的频率 private static int MONITOR_DURATION = 2; // 启动监控线程 static { new Thread(new TimeoutTimerThread()).start(); } //使用默认容量创建一个Map private static ConcurrentHashMap<String, CacheEntity> cache = new ConcurrentHashMap<String, CacheEntity>( DEFAULT_CAPACITY); /** * 将key-value 保存到本地缓存并制定该缓存的过期时间 * * @param key * @param value * @param expireTime 过期时间,如果是-1 则表示永不过期 * @return */ public boolean putValue(String key, Object value, int expireTime) { return putCloneValue(key, value, expireTime); } /** * 将值通过序列化clone 处理后保存到缓存中,可以解决值引用的问题 * * @param key * @param value * @param expireTime * @return */ private boolean putCloneValue(String key, Object value, int expireTime) { try { if (cache.size() >= MAX_CAPACITY) { return false; } // 序列化赋值 CacheEntity entityClone = clone(new CacheEntity(value, System.nanoTime(), expireTime)); cache.put(key, entityClone); return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * * 序列化 克隆处理 * @param object * @return */ private <T extends Serializable> T clone(T object) { T cloneObject = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); cloneObject = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return cloneObject; } /** *从本地缓存中获取key对应的值,如果该值不存则则返回null * * @param key * @return */ public Object getValue(String key) { return cache.get(key).getValue(); } /** * 清空所有 */ public void clear() { cache.clear(); } /** * 过期处理线程 * * @author Lenovo * @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:34:23 Lenovo Exp $ */ static class TimeoutTimerThread implements Runnable { public void run() { while (true) { try { System.out.println("Cache monitor"); TimeUnit.SECONDS.sleep(MONITOR_DURATION); checkTime(); } catch (Exception e) { e.printStackTrace(); } } } /** * 过期缓存的具体处理方法 * @throws Exception */ private void checkTime() throws Exception { //"开始处理过期 "; for (String key : cache.keySet()) { CacheEntity tce = cache.get(key); long timoutTime = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - tce.getGmtModify()); //" 过期时间 : "+timoutTime); if (tce.getExpire() > timoutTime) { continue; } System.out.println(" 清除过期缓存 : " + key); //清除过期缓存和删除对应的缓存队列 cache.remove(key); } } } }
相关推荐
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
本篇文章主要介绍了Java中LocalCache本地缓存实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本篇文章主要介绍了Java本地缓存的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了实现 Java 本地缓存的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于java的map和timer实现本地缓存及定时清理失效缓存的功能 本项目仅用于初学者学习使用 初学者可基于此项目初步了解缓存实现的基本原理 后期在项目中使用建议使用现成的缓存框架:redis、ehcache等
主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java实现缓存可以通过读取本地文件的方式实现,改代码就是通过读取本地文件实现缓存的简单例子
EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 主要的特性有: 1. 快速. 2. 简单. 3. 多种缓存策略 4.... 提供Hibernate的缓存实现 10. 等等
java Map实现的cache manager,定时清除缓存里面的值,使数据一致保持最新
利用spring实现的简单的缓存的例子,代码解释:http://blog.csdn.net/maoyeqiu/article/details/50238035
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
主要介绍了Java缓存Map设置过期时间实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Caffeine是一个基于Java 1.8的高性能本地缓存库,源自Guava的改进。自Spring 5开始,Caffeine已成为默认的缓存实现,取代了原先的Google Guava。官方资料显示,Caffeine的缓存命中率已接近理论最优值。实际上,...
本篇文章主要介绍了Java实现一个简单的缓存方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本篇文章主要介绍了Java LocalCache 本地缓存的实现实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
实现一个基本的webProxy Cache,java代码,默认字符集请改为utf-8,目前只能缓存本地web服务器上的网页,图片。
本地缓存中仅存储一些固定不变、或者不常变化的数据。 通过过期重新加载、定时refresh等策略定时更新本地的缓存,忍受数据有一定时间内的不一致。 对于少量更新的场景,借助MQ构建更新机制,有变更就发到MQ中然后...
缓存是我们在开发中经常遇到要解决的问题,有页面缓存、应用级别的缓存,应用级缓存又分为本地缓存、分布式缓存,在本地缓存中,常用的有成员变量或局部变量实现、静态变量实现、Ehcache、Guava组件、Spring注解缓存...
实现多机本地缓存的获取功能。 与Jedis的API相似,可轻松实现操作。 最小化配置和包装,力求精简。项目介绍基于Ehcache2和Redis的实现的Java的分布式二级缓存。除基本操作以外实现多机集群时各级缓存的监管和抓取。...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...