Java緩存池代碼實(shí)例詳解
這篇實(shí)例中有四個(gè)類(lèi),分別為
CacheItem 緩存實(shí)體類(lèi)
CachePool 緩存池
Student 學(xué)生實(shí)體類(lèi)
MainTest 主測(cè)試類(lèi)
其中,緩存實(shí)體類(lèi)CacheItem 中存放管理學(xué)生實(shí)體對(duì)象Student ,緩存實(shí)體類(lèi)CacheItem 存放在緩存池CachePool 中,MainTest 主要負(fù)責(zé)整體的測(cè)試工作。
緩存實(shí)體類(lèi)
package com.paic.zhangqi.cache;
import java.util.Date;
/**
* 緩存實(shí)體
* @author ZHANGQI947
*/
public class CacheItem {
// 創(chuàng)建緩存時(shí)間
private Date createTime = new Date();
// 緩存期滿時(shí)間
private long expireTime = 1;
// 緩存實(shí)體
private Object entity;
public CacheItem(Object obj, long expires) {
this.entity = obj;
this.expireTime = expires;
}
// 判斷緩存是否超時(shí)
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 {
// 緩存池唯一實(shí)例
private static CachePool instance;
// 緩存Map
private static Map<String, Object> cacheItems;
private CachePool() {
cacheItems = new HashMap<String, Object>();
}
/**
* 獲取唯一的實(shí)例
* @return instance
*/
public synchronized static CachePool getInstance() {
if (instance == null) {
instance = new CachePool();
}
return instance;
}
/**
* 清除所有的Item緩存
*/
public synchronized void clearAllItems() {
cacheItems.clear();
}
/**
* 獲取緩存實(shí)例
* @param name 緩存名稱(chēng)
* @return 緩存實(shí)例
*/
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 名稱(chēng)
* @param obj 實(shí)例對(duì)象
* @param expires 超時(shí)時(shí)長(zhǎng)
*/
public synchronized void putCacheItem(String name, Object obj, long expires) {
// 判斷該對(duì)象是否在在緩存池,不在直接put
if (!cacheItems.containsKey(name)) {
cacheItems.put(name, new CacheItem(obj, expires));
}
// 獲取緩存池中對(duì)象,更新對(duì)象信息
CacheItem cacheItem = (CacheItem) cacheItems.get(name);
cacheItem.setCreateTime(new Date());
cacheItem.setEntity(obj);
cacheItem.setExpireTime(expires);
}
/**
* 移除緩存數(shù)據(jù)
* @param name
*/
public synchronized void removeCacheItem(String name) {
if (!cacheItems.containsKey(name)) {
return ;
}
cacheItems.remove(name);
}
/**
* 獲取緩存數(shù)據(jù)的數(shù)量
* @return
*/
public int getSize() {
return cacheItems.size();
}
}
學(xué)生類(lèi)Student
package com.paic.zhangqi.cache;
/**
* 學(xué)生類(lèi)
* @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;
}
}
主測(cè)試類(lèi)MainTest
package com.paic.zhangqi.cache;
/**
* 主測(cè)試類(lèi)
* @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);
// 設(shè)置線程休眠,其中002對(duì)象會(huì)超時(shí)
Thread.sleep(200);
Student stu001 = (Student) cachePool.getCacheItem("001");
if (null != stu001) {
System.out.println(stu001.getName());
}
// 由于超時(shí),這里取出的002對(duì)象為null
Student stu002 = (Student) cachePool.getCacheItem("002");
if (null != stu002) {
System.out.println(stu002.getName());
}
// 獲取打印緩存池中對(duì)象數(shù)量
int cacheSize = cachePool.getSize();
System.out.println(cacheSize);
// 刪除對(duì)象002
cachePool.removeCacheItem("002");
// 打印緩存池?cái)?shù)量
cacheSize = cachePool.getSize();
System.out.println(cacheSize);
}
}
測(cè)試結(jié)果
l1
4
3
希望本篇文章內(nèi)容對(duì)您有所幫助
相關(guān)文章
SpringBoot中Zookeeper分布式鎖的原理和用法詳解
Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù),它提供了高可用、高性能、可擴(kuò)展的分布式鎖機(jī)制,SpringBoot是一個(gè)基于Spring框架的開(kāi)發(fā)框架,它提供了對(duì)Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下2023-07-07
SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解
這篇文章主要介紹了SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況,借助FilterRegistrationBean來(lái)注冊(cè)filter,可以避免在web.xml種配置filter這種原始的寫(xiě)法2023-02-02
Java 在Excel中添加分離型餅圖、環(huán)形圖的方法
這篇文章主要介紹了Java 在Excel中添加分離型餅圖、環(huán)形圖的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12
Java中equals()方法重寫(xiě)實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中equals()方法重寫(xiě)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java如何將處理完異常之后的程序能夠從拋出異常的地點(diǎn)向下執(zhí)行?
今天小編就為大家分享一篇關(guān)于Java如何將處理完異常之后的程序能夠從拋出異常的地點(diǎn)向下執(zhí)行?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
使用redisTemplate的scan方式刪除批量key問(wèn)題
這篇文章主要介紹了使用redisTemplate的scan方式刪除批量key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

