在現在緩存框架橫行的時代,仍是有必要了解下基本的緩存原理,本文講解下純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測試