1. 程式人生 > >Java自動過期本地快取簡單實現

Java自動過期本地快取簡單實現

實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能

LocalCache.java

interface LocalCache {

	public void refresh();
}

LocalCacheItem.java

/**
 * 快取項
 * @author: 
 * @date: 2018年2月6日 下午6:01:33
 */
public class LocalCacheItem {

	// 快取時間:單位毫秒
	private long cacheTime;
	// 建立時間:單位毫秒
	private long createTime;
	// 快取值
	private Object value;
	
	public LocalCacheItem() {
		super();
	}

	public LocalCacheItem(long cacheTime, long createTime, Object value) {
		super();
		this.cacheTime = cacheTime;
		this.createTime = createTime;
		this.value = value;
	}

	public long getCacheTime() {
		return cacheTime;
	}
	public void setCacheTime(long cacheTime) {
		this.cacheTime = cacheTime;
	}
	public long getCreateTime() {
		return createTime;
	}
	public void setCreateTime(long createTime) {
		this.createTime = createTime;
	}
	public Object getValue() {
		return value;
	}
	public void setValue(Object value) {
		this.value = value;
	}
	
}

LocalCacheManage.java

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * 本地快取管理器,CommandLineRunner應用啟動執行
 * @author:  
 * @date: 2017年12月20日 上午11:54:53
 */
@Component
public class LocalCacheManage implements CommandLineRunner{

	@Autowired private List<LocalCache> localCaches;
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	/**
	 * 應用啟動初始化
	 */
	@Override
	public void run(String... args) throws Exception {
		// 1分鐘重新整理一次,時間可以自定義。這裡作為心跳執行緒,定時重新整理快取
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			public void run() {
				if(localCaches!=null && !localCaches.isEmpty()){
					for(LocalCache cache : localCaches){
						try {
							cache.refresh();
						} catch (Exception e) {
							logger.error("本地快取更新異常", e);
						}
					}
				}
			}
		}, 0, 60000);
	}
	
}

CommomLocalCache.java

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Component;

/**
 * 公用本地快取
 * @author:  
 * @date: 2017年12月20日 下午2:18:25
 */
@Component
public class CommomLocalCache implements LocalCache{

	private static ConcurrentHashMap<String, LocalCacheItem> cache = new ConcurrentHashMap<>();
	
	public static boolean containsKey(String key){
		return cache.containsKey(key);
	}
	
	/**
	 * 快取值
	 * @author:  
	 * @date: 2018年2月6日 下午5:24:20 
	 * @param key
	 * @param value
	 */
	public static void put(String key, Object value){
		LocalCacheItem item = new LocalCacheItem(0, System.currentTimeMillis(), value);
		cache.put(key, item);
	}
	
	/**
	 * 快取值-指定快取時間
	 * @author:  
	 * @date: 2018年2月6日 下午5:35:05 
	 * @param key
	 * @param value
	 * @param cacheTime 快取時間
	 * @param unit 快取時間單位
	 */
	public static void put(String key, Object value, long cacheTime, TimeUnit unit){
		LocalCacheItem item = new LocalCacheItem(unit.toMillis(cacheTime), System.currentTimeMillis(), value);
		cache.put(key, item);
	}
	
	/**
	 * 獲取值
	 * @author:  
	 * @date: 2018年2月6日 下午5:34:28 
	 * @param key
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T>T get(String key){
		LocalCacheItem item = cache.get(key);
		if(item==null){
			return null;
		}
		return (T)item.getValue();
	}

	@Override
	public void refresh() {
		for(String key : cache.keySet()){
		    LocalCacheItem item = cache.get(key);
		    // 過期了移除快取
		    long currentTime = System.currentTimeMillis();
	            if(item.getCacheTime()>0 && currentTime - item.getCreateTime() > item.getCacheTime()) {
	        	cache.remove(key);
	            }    
		}
	}

}

拓展:上面的本地快取控制是通過CommomLocalCache工具類操作key、value,還有一種是嵌入到具體的類中,對類中的map、list進行過期控制,下面是實現方式和示例

AbstractLocalCache.java

import java.util.concurrent.TimeUnit;

/**
 * 本地快取抽象類
 * LocalCacheManage每隔一分鐘執行一次重新整理,cacheTime,createTime不設定的,預設就是一分鐘更新一次
 * @author:  
 * @date: 2017年12月20日 上午11:53:58
 */
public abstract class AbstractLocalCache implements LocalCache{

	// 快取時間:單位毫秒
	private long cacheTime;
	// 建立時間:單位毫秒
	private long createTime;
	
	@Override
	public void refresh() {
		// 過期了重新整理快取
		long currentTime = System.currentTimeMillis();
        if(currentTime - createTime > cacheTime) {
            doRefresh();
            this.createTime = System.currentTimeMillis();
        }
	}

	public abstract void doRefresh();

	/**
	 * 指定單位
	 * @author:  
	 * @date: 2017年12月20日 下午12:09:10 
	 * @param cacheTime
	 * @param unit
	 */
	public void setCacheTime(long cacheTime, TimeUnit unit) {
		this.cacheTime = unit.toMillis(cacheTime);
	}

	/**
	 * 毫秒
	 * @author:  
	 * @date: 2017年12月20日 下午12:07:46 
	 * @param cacheTime
	 */
	public void setCacheTime(long cacheTime) {
		this.cacheTime = cacheTime;
	}
	
}

Simple.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 下面示例表示本地快取cache 每10分鐘清一次
 * @author:  
 * @date: 2018年1月25日 下午2:50:51
 */
public class Simple extends AbstractLocalCache{

	private static Map<String, Object> cacheMap = new HashMap<>();
	private static List<Object> cacheList = new ArrayList<>();
	
	@Override
	public void doRefresh() {
		// 清空
		cacheMap.clear();
		cacheList.clear();
		// TODO 重新更新
		// 10分鐘
		super.setCacheTime(10, TimeUnit.MINUTES);
	}

}

LliLliliL

相關推薦

Java自動過期本地快取簡單實現

實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能LocalCache.javainterface LocalCache { public void refresh()

canvas的繪製文字自動換行 最簡單實現

先看下效果圖: 程式碼如下,後面解釋(小程式為例) content = "canvas的繪製文字自動換行 By Frank"; const ctx = wx.createCanvasContext('canvas'); ctx.setFontSize(1

Java——多執行緒的簡單實現

中高階架構師的必經之路: 高可用、高併發、高效能網站開發 多執行緒基本概念: 多個程序同時進 執行緒:排程和執行的單位(cpu的排程) 程序:作為資源分配的單位(作業系統的分配) 執行緒是程序的一部分 使用者執行緒和守護執行緒 使用者執行緒

mongoDB——自動分片介紹及簡單實現

      分片,是指將資料拆分,將其分散到不同的機器上。這樣的好處就是,不需要功能強大的大型計算機也可以儲存更多的資料,處理更大的負載。       mongoDB的分片,是將collection的

Java 多叉樹的簡單實現

Node實體: package com.javatest.NodeA; import java.io.Serializable; import java.util.ArrayList; import

java之斷點續傳簡單實現

斷點續傳主要是使用http協議中range的屬性來取得資源的部分內容,由於一般服務是不對外直接提供url訪問的,一般都是通過id,在servlet中輸出byte[]來實現,所以要想實現斷點續傳一般要自己實現服務端和客戶端,客戶端保持檔案的下載或上傳狀態,(儲存在本地或者資料

java之執行緒池簡單實現

以前做的東西,實現一個簡單的多執行緒機制,開始之前,現說說原理性的東西吧,下面是我在ibm開發者上搜到的內容 執行緒池的技術背景   在面向物件程式設計中,建立和銷燬物件是很費時間的,因為建立一個物件要獲取記憶體資源或者其它更多資源。在Java中更是如此,虛擬機器將

java學生管理系統介面簡單實現

學生管理系統簡單的實現,供初學Java Swing同學學習使用。 import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import j

Android無限迴圈與自動播放ViewPager的簡單實現(廣告欄)

之前寫過一個簡單的ViewPager指示器,但是隻能夠展示指定數量的內容,沒有實現無限迴圈和自動播放功能,今天來完整的把這幾個功能寫一下吧.當然還是用到之前寫的簡單的ViewPager指示器,並做一些小修改,來配合無限迴圈和自動播放. 效果圖如下:

java的MD5加密的簡單實現

初學者的一個簡單實現,感覺比較容易理解   public String md5Digest(String src) throws Exception { // 定義數字簽名方法, 可用:MD5, SHA-1 MessageDigest md =

JAVA執行緒池的簡單實現及優先順序設定

{    privatestatic ThreadPool instance =null;    // 優先順序低publicstaticfinalint PRIORITY_LOW =0;    // 普通publicstaticfinalint PRIORITY_NORMAL =1;    // 高publ

java遠端通訊技術及簡單實現

本文轉載自:http://blog.sina.com.cn/s/blog_4ad7c2540100bwe1.html 在分散式服務框架中,一個最基礎的問題就是遠端服務是怎麼通訊的,在Java底層領域中有很多可實現遠端通訊的技術,例如:RMI、MINA、ESB、Burlap

使用ob快取簡單實現頁面靜態化

<?php //接收新聞id,傳統的方法查詢資料庫並顯示資料 $id=intval($_GET['id']); //先判斷該新聞對於的靜態頁面是否存在,如果有,則直接返回,如果 //沒

java的雙向連結串列簡單實現

 package com.test; public class SecondTest {  public static void main(String[] args) {   DoubleList test=new DoubleList();   test.Inse

JAVA 可逆加密演算法的簡單實現

很多加密包都提供複雜的加密演算法,比如MD5,這些演算法有的是不可逆的。 有時候我們需要可逆演算法,將敏感資料加密後放在資料庫或配置檔案中,在需要時再再還原。 這裡介紹一種非常簡單的java實現可逆加密演算法。 演算法使用一個預定義的種子(seed)來對加密內容進行異或執行

java agent技術原理及簡單實現

注:本文定義-在函式執行前後增加對應的邏輯的操作統稱為MOCK 1、引子 在某天與QA同學進行溝通時,發現QA同學有針對某個方法呼叫時,有讓該方法停止一段時間的需求,我對這部分的功能實現非常好奇,因此決定對原理進行一些深入的瞭解,力爭找到一種使用者儘可能少的對原有程式碼進行修改的方式,以達到對應的MOCK要求

LRU cache快取簡單實現

LRU cache     LRU(最近最少使用)是一種常用的快取淘汰機制。當快取大小容量到達最大分配容量的時候,就會將快取中最近訪問最少的物件刪除掉,以騰出空間給新來的資料。 實現 (1)單執行緒簡單版本        ( 來源:力扣(L

使用java動態位元組碼技術簡單實現arthas的trace功能。

參考資料 ASM 系列詳細教程 編譯時,找不到asm依賴 用過[Arthas]的都知道,Arthas是alibaba開源的一個非常強大的Java診斷工具。 不管是線上還是線下,我們都可以用Arthas分析程式的執行緒狀態、檢視jvm的實時執行狀態、列印方法的出入參和返回型別、收集方法中每個程式碼塊耗時, 甚至

Java ConcurrentHashmap實現Localcache本地快取

很多場景下,有些請求的資料,是不會經常改變的,這種時候,為了減少資料庫的查詢壓力,可以將這一部分資料放入快取中,直接從快取中讀取。除了一些像Redis等快取外,還可以通過本地記憶體,作為快取。下邊將使用ConcurrentHashMap來實現本地快取。 >相關的技術:

Java中基於靜態變數與單例模式對快取簡單實現

●What & Why 快取是什麼?他有什麼好處?相信不用說大家都知道。 目前筆者在做一個Java開發的Web專案,專案啟動的時候需要將大量不變的平臺數據放入快取中,方便快速讀取。一開始筆者很疑惑,Java是不能直接操作記憶體的,但是我們快取卻是要把資料放入記憶體