日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java框架缓存,缓存框架(Java缓存)与框架缓存(介绍mybatis缓存)

發(fā)布時(shí)間:2025/3/20 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java框架缓存,缓存框架(Java缓存)与框架缓存(介绍mybatis缓存) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。