所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查‘
代码说明:静态方法可以通过类名进行访问,私有的构造函数可以防止类在外部实例化,就是防止在外部new这个类,参考。synchronized,参考
cacheManager.java。用map存放缓存,实现缓存逻辑,增删改查。
userService.java。管理用户的信息,这里实现用户缓存信息的查询
Test.java。测试类。测试缓存的信息是否有效。
运行效果:
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以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");
}
}
运行效果: