java cache 学习记录之一

所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类: 
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;  
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查‘
       代码说明:静态方法可以通过类名进行访问,私有的构造函数可以防止类在外部实例化,就是防止在外部new这个类,参考。synchronized,参考

这是完全自定义的缓存实现,即不用任何第三方的组件来实现某种对象的内存缓存。场景是:对一个用户查询方法做缓存,以用户名称为 key,用户对象为 value,当以相同的用户名称查询的时候,直接从缓存中返回结果,否则更新缓存。账号查询服务还支持 reload 缓存(即清空缓存)。这里模拟了数据的登陆。源码下载

User.java。定义了用户的id,登陆名称,登陆密码

package com.cache.entity;

public class User {
	private int id;
	private String userName;
	private String passWord;
	public User(String userName){
		this.userName = userName;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}

}

cacheManager.java。用map存放缓存,实现缓存逻辑,增删改查。

package com.service.impl;

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

public class cacheManager <T> {

	private Map<String,T> cache =  new ConcurrentHashMap<String,T>(); 
	
	public T getValue(Object key){
		return cache.get(key);
	}
	
	public void addOrUpdate(String key, T value){
		cache.put(key, value);
	}
	
	//根据key值来删除缓存中的一条记录
	public void evict(String key){
		if(cache.containsKey(key)){
			cache.remove(key);
		}
	}
	
	//清空缓存中的所有记录
	public void evictCache(){
		cache.clear();
	}
}

userService.java。管理用户的信息,这里实现用户缓存信息的查询

package com.service.impl;

import com.cache.entity.User;

public class userService {
	private cacheManager<User> cacheManager;
	
	//构造一个缓存管理器
	public userService(){
		cacheManager = new cacheManager<User>();
	}
	
	public User getUserByName(String userName){
		//首先检查缓存
		User user = cacheManager.getValue(userName);
		if(user != null){
			System.out.println("在cache中获取"+userName);
			//如果存在缓存中,则直接返回缓存的结果
			return user;
		}
		//否则到数据库中查询
		user = getFromDB(userName);
		//将数据库中查询的结果更新到缓存中
		if(user != null){
			cacheManager.addOrUpdate(userName, user);
		}
		return user;
	}
	
	public void reload(){
		cacheManager.evictCache();
	}
	
	//模拟数据库的查询
	private User getFromDB(String userName){
		System.out.println("从数据库中查询"+userName);
		return new User(userName);
	}

}

Test.java。测试类。测试缓存的信息是否有效。

package com.cache.test;

import com.service.impl.userService;

public class Test {
	   public static void main(String[] args) { 
	     userService userService = new userService(); 
	     // 开始查询用户
	     // 第一次查询,应该是数据库查询
	     userService.getUserByName("helloCache");
	     // 第二次查询,应该直接从缓存返回
	     userService.getUserByName("helloCache");
	     // 重置缓存
	     userService.reload();
	     System.out.println("重置之后"); 
	     // 重置之后的第一次查询
	     userService.getUserByName("helloCache");
	     // 重置之后的第二次查询
	     userService.getUserByName("helloCache");
	   } 
}

运行效果:







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值