java框架缓存,缓存框架(Java缓存)与框架缓存(介绍mybatis缓存)
Java緩存主要分為三種:
1、FIFO
2、LRU
3、LFU
它們一般應(yīng)用于瀏覽器中,使很多操作更加方便快捷。
1、FIFO:
FIFO是按存入的順序進(jìn)行排序的,如果命中緩存中的任意一個(gè)數(shù)據(jù),也不會破壞先進(jìn)先出的規(guī)則。如果新增了一個(gè)緩存之外的數(shù)據(jù),會把最先存入的數(shù)據(jù)移除。 先入先出,就和隊(duì)列一樣,先進(jìn)隊(duì)列的先出隊(duì)列。
import java.util.LinkedHashMap;
public class FIFOCache extends LinkedHashMap {
private static final long serialVersionUID = 436014030358073695L;
private final int SIZE;
public FIFOCache(int size) {
super();
SIZE = size;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
return size() > SIZE;
}
}
public class FIFOCacheTest {
public static void main(String[] args) {
FIFOCache map = new FIFOCache(10);
for (int i = 0; i++ < 10;) {
map.put(i, i);
}
System.out.println("起始存儲情況:"+map.toString());
map.put(8, 8);
System.out.println("命中一個(gè)已存在的數(shù)據(jù):"+map.toString());
map.put(11, 11);
System.out.println("新增一個(gè)數(shù)據(jù)后:"+map.toString());
}
}
復(fù)制代碼
2、LRU: 當(dāng)某一個(gè)數(shù)據(jù)被訪問命中就會按照LRU規(guī)則放到隊(duì)列最前面。如果新增一個(gè)不存在緩存的數(shù)據(jù),會把該數(shù)據(jù)放到最前面,同時(shí)移除最早訪問過的數(shù)據(jù)。
import java.util.LinkedHashMap;
public class LRUCache extends LinkedHashMap {
private static final long serialVersionUID = 5853563362972200456L;
private final int SIZE;
public LRUCache(int size) {
super(size, 0.75f, true);
SIZE = size;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
return size() > SIZE;
}
}
public class LRUCacheTest {
public static void main(String[] args) {
LRUCache map = new LRUCache(10);
for (int i = 0; i++ < 10; ) {
map.put(i, i);
}
System.out.println("起始存儲情況:"+map.toString());
map.get(7);
System.out.println("命中一個(gè)已存在的數(shù)據(jù):"+map.toString());
map.put(8, 8+1);
System.out.println("覆蓋一個(gè)已存在的數(shù)據(jù):"+map.toString());
map.put(11, 11);
System.out.println("新增一個(gè)數(shù)據(jù)后:"+map.toString());
}
}
復(fù)制代碼
3、LFU: 對存儲的數(shù)據(jù)都會有一個(gè)計(jì)數(shù)引用,然后隊(duì)列按數(shù)據(jù)引用次數(shù)排序,引用數(shù)多的排在最前面,引用數(shù)少的排在后面。如果這個(gè)時(shí)候有新的數(shù)據(jù)進(jìn)來,把最后面的數(shù)據(jù)刪除,把新進(jìn)數(shù)據(jù)排在最后面,且引用次數(shù)為1
import java.util.*;
public class LFUCache{
static class Value implements Comparable{
Object key;
Object val;
int hitCount;
public Value(Object v, Object key) {
this.key = key;
this.val = v;
this.hitCount = 1;
}
public void setVal(Object obj){
this.val = obj;
}
public void countInc(){
hitCount++;
}
@Override
public int compareTo(Value o) {
if(o instanceof Value){
Value v = (Value) o;
if(this.hitCount > v.hitCount)
return 1;
else
return -1;
}
return 0;
}
}
final int SIZE;
private Map map = new HashMap();
public LFUCache(int size) {
SIZE = size;
}
public Object get(Object k){
if(k == null)
return null;
map.get(k).countInc();
return map.get(k).val;
}
public void put(Object k, Object v){
if(map.get(k) != null){
map.get(k).countInc();
map.get(k).setVal(v);
}else{
if(map.size() >= SIZE){
remove();
}
Value value = new Value(v, k);
map.put(k, value);
}
}
public void remove(){
Value v = Collections.min(map.values());
map.remove(v.key);
}
public String showList(){
List list = new ArrayList();
list.addAll(map.values());
Collections.sort(list);
String result = "";
for (Value value : list) {
result +=value.key+"="+value.val+" ";
}
return result;
}
}
public class LFUCacheTest {
public static void main(String[] args) {
LFUCache map = new LFUCache(10);
for (int i = 0; i++ < 10; ) {
map.put(i, i);
}
System.out.println("起始存儲情況:"+map.showList());
map.get(7);
System.out.println("命中一個(gè)已存在的數(shù)據(jù):"+map.showList());
map.put(8, 8+1);
System.out.println("覆蓋一個(gè)已存在的數(shù)據(jù):"+map.showList());
map.put(11, 11);
System.out.println("新增一個(gè)數(shù)據(jù)后:"+map.showList());
map.put(5, 5);
map.put(5, 5);
map.put(6, 6);
map.put(6, 6);
map.put(6, 6);
System.out.println("修改命中次數(shù)后:"+map.showList());
}
}
復(fù)制代碼
mybatis的緩存可以分為一級和二級緩存。
其中一級緩存也叫本地緩存;當(dāng)你要在一段時(shí)間內(nèi)獲取相同的數(shù)據(jù)時(shí),如果每次都去查詢數(shù)據(jù)庫,就會顯得特別麻煩,這時(shí)候一級緩存就派上了用場,它能夠?qū)⑴c數(shù)據(jù)庫會話時(shí)查詢到的數(shù)據(jù)放在本地的緩存中,這時(shí)候要相同數(shù)據(jù)就可以直接從緩存中獲取,就省去很多麻煩。
二級緩存也叫作全局緩存。一個(gè)命名域?qū)?yīng)一個(gè)二級緩存,發(fā)生一個(gè)會話的時(shí)候查詢數(shù)據(jù)中的數(shù)據(jù),這個(gè)數(shù)據(jù)就會被保留在當(dāng)前的一級緩存中。當(dāng)會話關(guān)閉的時(shí)候一級緩存的數(shù)據(jù)就會被保存在二級緩存中;開始新會話的時(shí)候,如果要查詢新的信息就可以用二級緩存中的內(nèi)容。
//截取的一部分實(shí)現(xiàn)代碼
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.atguigu.mybatis.bean.Department;
import com.atguigu.mybatis.bean.Employee;
import com.atguigu.mybatis.dao.DepartmentMapper;
import com.atguigu.mybatis.dao.EmployeeMapper;
import com.atguigu.mybatis.dao.EmployeeMapperAnnotation;
import com.atguigu.mybatis.dao.EmployeeMapperDynamicSQL;
import com.atguigu.mybatis.dao.EmployeeMapperPlus;
public class MyBatisTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFirstLevelCache() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(1);
System.out.println(emp01);
}finally{
openSession.close();
}
}
@Test
public void testSecondLevelCache() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
SqlSession openSession2 = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(1);
System.out.println(emp01);
openSession.close();
Employee emp02 = mapper2.getEmpById(1);//從二級緩存中拿的數(shù)據(jù)
System.out.println(emp02);
openSession2.close();
}finally{
}
}
}
復(fù)制代碼
總結(jié)
以上是生活随笔為你收集整理的java框架缓存,缓存框架(Java缓存)与框架缓存(介绍mybatis缓存)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 中curd表达啥,CURD语句的
- 下一篇: java美元兑换,(Java实现) 美元