java--java實現純緩存

在現在緩存框架橫行的時代,仍是有必要了解下基本的緩存原理,本文講解下純java實現的緩存,能夠用於一些小項目中作測試使用。在真實的項目中,通常不多使用不帶框架的純緩存。
####1.基本類,即須要緩存的對象java

public class Account {
	private int id;
	private String name;
}

####2.緩存管理器
主要負責通用的對象添加/更新/刪除、查詢等操做spring

package com.test.spring.cacheCommon;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 定義一個緩存管理器,在一個工程中能夠公用
 * 負責實現 對象添加/修改/刪除
 * 值對象是泛型
 */
public class MyCacheManager<T> {
	
	private Map<Object, T> cache = new ConcurrentHashMap<>();
	
	//根據key獲取對象值
	public T getValue(Object key)
	{
		return cache.get(key);
	}
	
	//添加/更新對象
	public void addOrUpdateCache(Object key,T value)
	{
		cache.put(key, value);
	}
	
	//根據key來刪除緩存中一條記錄
	public void evictCache(Object key)
	{
		if (cache.containsKey(key)) {
			cache.remove(key);
		}
	}
	
	//清空全部緩存記錄
	public void evictCache(){
		cache.clear();
	}
}

####3.業務類數據庫

package com.test.spring.cacheCommon;

/**
 * 業務類 
 */
public class MyAccountService {
	
	private MyCacheManager<Account> myCacheManager;
	
	//構造器
	public MyAccountService() {
		
		myCacheManager = new MyCacheManager<>();
	}
	
	//根據key獲取對象值
	public Account getAccountByName(String name){
		Account result = myCacheManager.getValue(name);
		if (result != null) {
			//該對象存在於緩存中,直接返回
			System.out.println("直接從緩存返回");
			return result;
		}
		
		//不然,去數據庫中查詢
		result = getFromDB(name);
		if (result != null) {
			//將數據庫查詢結果更新到緩存中去
			myCacheManager.addOrUpdateCache(name, result);
		}
		return result;
	}
	
	//清空全部緩存記錄
	public void reload()
	{
		System.out.println("清空緩存");
		myCacheManager.evictCache();
	}
	
	//數據庫查詢
	private Account getFromDB(String name) {
		System.out.println("去數據庫查詢");
		return new Account(name);
	}
	
}

####4.測試類緩存

public class Main {
	
	public static void main(String[] args) {
		
		MyAccountService myAccountService = new MyAccountService();
		
		//第一次查詢,去數據庫查詢
		myAccountService.getAccountByName("張三");
		//第二次查詢,從緩存中查詢
		myAccountService.getAccountByName("張三");
		
		//清空緩存
		myAccountService.reload();
		//第三次查詢,從數據庫查詢
		myAccountService.getAccountByName("張三");
		//第四次查詢,從緩存中查詢
		myAccountService.getAccountByName("張三");
	}

####5.輸出結果框架

去數據庫查詢
直接從緩存返回
清空緩存
去數據庫查詢
直接從緩存返回

####總結
從輸出結果來看,很明顯達到了緩存的目的。可是也很明顯發現諸多缺點:
1.緩存代碼與業務代碼耦合度過高。業務類(MyAccountService)中摻雜了太多的緩存邏輯,不利於修改。
2.隨着業務的增長,緩存管理器中的代碼會愈來愈多,不利於維護。
3.不靈活,緩存的存儲寫得比較死,不能快速的切換爲三方緩存模塊。
所以,須要改善,請看spring分類中springCache。
http://my.oschina.net/u/2312022/blog/742505測試

相關文章
相關標籤/搜索