Java缓存池代码实例详解

这篇实例中有四个类,分别为

CacheItem  缓存实体类

CachePool  缓存池

Student  学生实体类

MainTest  主测试类

其中,缓存实体类CacheItem  中存放管理学生实体对象Student  ,缓存实体类CacheItem  存放在缓存池CachePool  中,MainTest  主要负责整体的测试工作。

缓存实体类

package com.paic.zhangqi.cache;
import java.util.Date; 

/**
 * 缓存实体
 * @author ZHANGQI947
 */
public class CacheItem {
 // 创建缓存时间
 private Date createTime = new Date();
 // 缓存期满时间
 private long expireTime = 1;
 // 缓存实体
 private Object entity;
 public CacheItem(Object obj, long expires) {
  this.entity = obj;
  this.expireTime = expires;
 }
 // 判断缓存是否超时
 public boolean isExpired() {
  return (expireTime != -1 && new Date().getTime() - createTime.getTime() > expireTime);
 }
 public Date getCreateTime() {
  return createTime;
 }
 public void setCreateTime(Date createTime) {
  this.createTime = createTime;
 }
 public Object getEntity() {
  return entity;
 }
 public void setEntity(Object entity) {
  this.entity = entity;
 }
 public long getExpireTime() {
  return expireTime;
 }
 public void setExpireTime(long expireTime) {
  this.expireTime = expireTime;
 }
} 

缓存池CachePool

package com.paic.zhangqi.cache;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * 缓存池
 * @author Administrator
 */
public class CachePool {
 // 缓存池唯一实例
 private static CachePool instance;
 // 缓存Map
 private static Map<String, Object> cacheItems;
 private CachePool() {
  cacheItems = new HashMap<String, Object>();
 }
 /**
  * 获取唯一的实例
  * @return instance
  */
 public synchronized static CachePool getInstance() {
  if (instance == null) {
   instance = new CachePool();
  }
  return instance;
 }
 /**
  * 清除所有的Item缓存
  */
 public synchronized void clearAllItems() {
  cacheItems.clear();
 }
 /**
  * 获取缓存实例
  * @param name 缓存名称
  * @return 缓存实例
  */
 public synchronized Object getCacheItem(String name) {
  if (!cacheItems.containsKey(name)) {
   return null;
  }
  CacheItem cacheItem = (CacheItem) cacheItems.get(name);
  if (cacheItem.isExpired()) {
   return null;
  }
  return cacheItem.getEntity();
 }
 /**
  * 存放缓存信息
  * @param name 名称
  * @param obj 实例对象
  * @param expires 超时时长
  */
 public synchronized void putCacheItem(String name, Object obj, long expires) {
  // 判断该对象是否在在缓存池,不在直接put
  if (!cacheItems.containsKey(name)) {
   cacheItems.put(name, new CacheItem(obj, expires));
  }
  // 获取缓存池中对象,更新对象信息
  CacheItem cacheItem = (CacheItem) cacheItems.get(name);
  cacheItem.setCreateTime(new Date());
  cacheItem.setEntity(obj);
  cacheItem.setExpireTime(expires);
 }
 /**
  * 移除缓存数据
  * @param name
  */
 public synchronized void removeCacheItem(String name) {
  if (!cacheItems.containsKey(name)) {
   return ;
  }
  cacheItems.remove(name);
 }
 /**
  * 获取缓存数据的数量
  * @return
  */
 public int getSize() {
  return cacheItems.size();
 }
} 

学生类Student

package com.paic.zhangqi.cache;
/**
 * 学生类
 * @author Administrator
 */
public class Student {
 private String name;
 private String id;
 private int age;
 private int sal;
 public Student() { 

 }
 public Student(String name, String id, int age, int sal) {
  this.name = name;
  this.id = id;
  this.age = age;
  this.sal = sal;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public int getSal() {
  return sal;
 }
 public void setSal(int sal) {
  this.sal = sal;
 }
}

主测试类MainTest

package com.paic.zhangqi.cache;
/**
 * 主测试类
 * @author ZHANGQI947
 */
public class MainTest { 

 /**
  * @param args
  * @throws InterruptedException
  */
 public static void main(String[] args) throws InterruptedException {
  // 获取缓存池
  CachePool cachePool = CachePool.getInstance();
  Student stu1 = new Student("l1", "stu001", 25, 40);
  Student stu2 = new Student("l2", "stu002", 25, 40);
  Student stu3 = new Student("l3", "stu003", 25, 40);
  Student stu4 = new Student("l4", "stu004", 25, 40);
  cachePool.putCacheItem("001", stu1, 122222);
  cachePool.putCacheItem("002", stu2, 10);
  cachePool.putCacheItem("003", stu3, 360002);
  cachePool.putCacheItem("004", stu4, 1222222);
  // 设置线程休眠,其中002对象会超时
  Thread.sleep(200);
  Student stu001 = (Student) cachePool.getCacheItem("001");
  if (null != stu001) {
   System.out.println(stu001.getName());
  }
  // 由于超时,这里取出的002对象为null
  Student stu002 = (Student) cachePool.getCacheItem("002");
  if (null != stu002) {
   System.out.println(stu002.getName());
  }
  // 获取打印缓存池中对象数量
  int cacheSize = cachePool.getSize();
  System.out.println(cacheSize);
  // 删除对象002
  cachePool.removeCacheItem("002");
  // 打印缓存池数量
  cacheSize = cachePool.getSize();
  System.out.println(cacheSize);
 }
} 

测试结果

l1 

3

希望本篇文章内容对您有所帮助

(0)

相关推荐

  • Java实现一个简单的缓存方法

    缓存是在web开发中经常用到的,将程序经常使用到或调用到的对象存在内存中,或者是耗时较长但又不具有实时性的查询数据放入内存中,在一定程度上可以提高性能和效率.下面我实现了一个简单的缓存,步骤如下. 创建缓存对象EntityCache.java public class EntityCache { /** * 保存的数据 */ private Object datas; /** * 设置数据失效时间,为0表示永不失效 */ private long timeOut; /** * 最后刷新时间 */

  • Android中Rxjava实现三级缓存的两种方式

    本文正如标题所说的用rxjava实现数据的三级缓存分别为内存,磁盘,网络,刚好最近在看Android源码设计模式解析与实战(受里面的ImageLoader的设计启发). 我把代码放到了我的hot项目中,github地址 源码下载地址:Rxjava_jb51.rar 1.使用concat()和first()的操作符. 2.使用BehaviorSubject. 先说BehaviorSubject的实现方法,废话不多说直接上代码, /** * Created by wukewei on 16/6/20

  • JAVA并发编程有界缓存的实现详解

    JAVA并发编程有界缓存的实现 1.有界缓存的基类 package cn.xf.cp.ch14; /** * *功能:有界缓存实现基类 *时间:下午2:20:00 *文件:BaseBoundedBuffer.java *@author Administrator * * @param <V> */ public class BaseBoundedBuffer<V> { private final V[] buf; private int tail; private int head

  • 【Redis缓存机制】详解Java连接Redis_Jedis_事务

    Jedis事务 我们使用JDBC连接Mysql的时候,每次执行sql语句之前,都需要开启事务:在MyBatis中,也需要使用openSession()来获取session事务对象,来进行sql执行.查询等操作.当我们对数据库的操作结束的时候,是事务对象负责关闭数据库连接. 事务对象用于管理.执行各种数据库操作的动作.它能够开启和关闭数据库连接,执行sql语句,回滚错误的操作. 我们的Redis也有事务管理对象,其位于redis.clients.jedis.Transaction下. Jedis事

  • 详解Java实现缓存(LRU,FIFO)

    现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80的数据是很少更改的,这样就可以引入缓存来进行读取,减少数据库的压力. 常用的缓存有Redis和memcached,但是有时候一些小场景就可以直接使用Java实现缓存,就可以满足这部分服务的需求. 缓存主要有LRU和FIFO,LRU是Least Recently Used的缩写,即最近最久未使用,FIFO就是先进先出,下面就使用Java来实现这两种缓存. LR

  • java shiro实现退出登陆清空缓存

    上一篇介绍了使用springmvc集成shiro登陆过程,通过FormAuthenticationFilter过滤器获取到用户输入的账号密码. shiro是一个被广泛使用的安全层框架,通过xml配置方式与spring无缝对接,用户的登陆/退出/权限控制/Cookie等管理系统基础功能交给shiro来管理. 一般,在JavaWEB管理平台系统时,用户退出系统之前没需要清除用户数据和关闭连接,防止垃圾数据堆积,shiro提供了LogoutFilter过滤器,我们可以继承LogoutFilter,重写

  • Java缓存池代码实例详解

    这篇实例中有四个类,分别为 CacheItem  缓存实体类 CachePool  缓存池 Student  学生实体类 MainTest  主测试类 其中,缓存实体类CacheItem  中存放管理学生实体对象Student  ,缓存实体类CacheItem  存放在缓存池CachePool  中,MainTest  主要负责整体的测试工作. 缓存实体类 package com.paic.zhangqi.cache; import java.util.Date; /** * 缓存实体 * @a

  • Java 常量池的实例详解

    Java 常量池的实例详解 Java的常量池中包含了类.接口.方法.字符串等一系列常量值.常量池在编译期间就已经确定,并保存在*.class文件中 一.对于相同的常量值,常量池中只保存一份拷贝. 而且,当一个字符串由多个字符串常量链接而成时,多个字符串被组成一个字符串常量. 例如: package lxg; public class main { public static void main(String[] args) { String name = "lengxuegang";

  • JAVA线程池原理实例详解

    本文实例讲述了JAVA线程池原理.分享给大家供大家参考,具体如下: 线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线程池的创建 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQu

  • Java包装类的缓存机制原理实例详解

    这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = 127; Integer b = 127; System.out.println(a == b); 这段代码输出的结果为true 使用自动装箱将基本类型转为封装类对象这个过程其实

  • java 打造阻塞式线程池的实例详解

    java 打造阻塞式线程池的实例详解 原来以为tiger已经自带了这种线程池,就是在任务数量超出时能够阻塞住投放任务的线程,主要想用在JMS消息监听. 开始做法: 在ThreadPoolExcecutor中代入new ArrayBlockingQueue(MAX_TASK). 在任务超出时报错:RejectedExecutionException. 后来不用execute方法加入任务,直接getQueue().add(task), 利用其阻塞特性.但是发现阻塞好用了,但是任务没有被处理.一看Qu

  • JAVA类变量及类方法代码实例详解

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. public class C { public static void main(String[] args){ Child ch1 = new Child(12,"小小"

  • java ThreadPoolExecutor 并发调用实例详解

    java ThreadPoolExecutor 并发调用实例详解 概述 通常为了提供任务的处理速度,会使用一些并发模型,ThreadPoolExecutor中的invokeAll便是一种. 代码 package test.current; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util

  • 浅谈JAVA中输入输出流实例详解

    java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家介绍JAVA中输入输出流实例详解. 流的层次结构 定义:        java将读取数据对象成为输入流,能向其写入的对象叫输出流.结构图如下: 1.输入输出: 输入/输出(Input/Output)是指对某

  • Java Executor 框架的实例详解

    Java Executor 框架的实例详解 大多数并发都是通过任务执行的方式来实现的. 一般有两种方式执行任务:串行和并行. class SingleThreadWebServer { public static void main(String[] args) throws Exception { ServerSocket socket = new ServerSocket(80); while(true) { Socket conn = socket.accept(); handleRequ

  • Java基础之代码死循环详解

    一.前言 代码死循环这个话题,个人觉得还是挺有趣的.因为只要是开发人员,必定会踩过这个坑.如果真的没踩过,只能说明你代码写少了,或者是真正的大神. 尽管很多时候,我们在极力避免这类问题的发生,但很多时候,死循环却悄咪咪的来了,坑你于无形之中.我敢保证,如果你读完这篇文章,一定会对代码死循环有一些新的认识,学到一些非常实用的经验,少走一些弯路. 二.死循环的危害 我们先来一起了解一下,代码死循环到底有哪些危害? 程序进入假死状态, 当某个请求导致的死循环,该请求将会在很大的一段时间内,都无法获取接

随机推荐