在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本地缓存ConcurrentHashMap
Java 本地缓存基于 LoadingCache 实现详解 在 Java 中,缓存是一种提高应用程序性能的重要手段。 LoadingCache 是 Guava 库提供的一种缓存实现方式,本文将详细介绍如何基于 LoadingCache 实现 Java 本地缓存。 一...
ConcurrentHashMap是Java中的一个线程安全的哈希表,可以用来实现本地缓存。其线程安全的特性使得基于ConcurrentHashMap的LocalCache在多线程并发环境下的操作是安全的。在JDK1.8中,ConcurrentHashMap还支持完全...
基于java的map和timer实现本地缓存及定时清理失效缓存的功能 本项目仅用于初学者学习使用 初学者可基于此项目初步了解缓存实现的基本原理 后期在项目中使用建议使用现成的缓存框架:redis、ehcache等
在实现本地缓存时,我们可以采用 ConcurrentHashMap 作为存储集合,使用定时删除策略来处理过期缓存,并采用最少使用策略来淘汰缓存。 Cache 对象类是实现本地缓存的核心部分, Cache 对象类实现了 Comparable ...
java实现缓存可以通过读取本地文件的方式实现,改代码就是通过读取本地文件实现缓存的简单例子
本文将深入探讨如何使用Java Map实现缓存技术,以及其中的关键知识点。 首先,让我们理解什么是缓存。缓存是一种存储技术,用于暂时保存经常访问的数据,以便于快速检索。在Java中,我们通常使用HashMap、...
本地缓存指的是将数据存储在应用程序的内存中,通常是Java的HashMap、Guava Cache或C#的MemoryCache等。这种方式的优点在于数据读取速度极快,因为避免了网络通信的延迟。但是,本地缓存的缺点也很明显,如数据一致...
本示例将聚焦于“Spring简单的缓存”实现,帮助开发者了解如何在Spring框架中集成和使用缓存功能。 Spring框架提供了强大的缓存抽象,支持多种缓存机制,如 EhCache、Redis、Hazelcast 和 Infinispan 等。在Spring...
1. 不能进行大量数据存储:本地缓存占用了应用进程的内存空间,比如 Java 进程的 JVM 内存空间,故不能进行大数据量存储。 2. 集群部署,数据可能存在不一致:需要应用服务保证数据一致性。 3. 应用重启,缓存数据...
当用户访问包含Applet的网页时,这些Applets会被下载到本地并运行,同时,Java运行环境(Java Virtual Machine, JVM)会将它们存储在本地缓存中,以优化后续的加载速度,避免每次访问都重新下载。 然而,这种缓存...
java Map实现的cache manager,定时清除缓存里面的值,使数据一致保持最新
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
在这个“Java缓存技术的使用实例”中,我们将深入探讨Java缓存的实现、工作原理以及如何部署和运行示例代码。 首先,让我们理解什么是缓存。缓存是一种存储机制,用于临时存储常用或最近使用的数据,以便快速访问。...
实现Java本地缓存的方法多种多样,常见的有以下几种: 1. **Guava Cache**:Google提供的Guava库包含了强大的缓存功能,支持自动过期、大小限制等特性。开发者可以通过简单的API设置缓存策略,并在需要时将缓存的...
3. 内置缓存:内置了本地缓存机制,无需额外编写代码即可实现数据的本地存储和读取。 4. 支持多种请求方法:GET、POST、PUT、DELETE等HTTP方法都可轻松使用。 5. 请求参数与Header管理:方便地添加请求参数和自定义...
java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现。
springboot笔记-集成Java本地缓存之王Caffeine Cache