在现在缓存框架横行的时代,仍是有必要了解下基本的缓存原理,本文讲解下纯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测试