在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的map和timer实现本地缓存及定时清理失效缓存的功能 本项目仅用于初学者学习使用 初学者可基于此项目初步了解缓存实现的基本原理 后期在项目中使用建议使用现成的缓存框架:redis、ehcache等
主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java实现缓存可以通过读取本地文件的方式实现,改代码就是通过读取本地文件实现缓存的简单例子
本篇文章主要介绍了Java本地缓存的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java本地缓存ConcurrentHashMap
EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 主要的特性有: 1. 快速. 2. 简单. 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量...
java map 缓存 //毫秒计算 this.timeOut = timeOut*1000;
主要介绍了实现 Java 本地缓存的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
redis本地缓存与redis缓存
java Map实现的cache manager,定时清除缓存里面的值,使数据一致保持最新
利用spring实现的简单的缓存的例子,代码解释:http://blog.csdn.net/maoyeqiu/article/details/50238035
java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现。
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
JS localStorage实现本地缓存的方法,需要的朋友可以参考一下
Java Hibernate缓存深入详解
Java的Applet,在你访问的时候会在本地缓存下来,以便在下次访问的时候提高访问速度。这个缓存和IE的缓存是不同的,不放在同一个地方。
分页缓存<用java实现分页,并读取过程先读取缓存数据>
Java的缓存应用