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

歡迎訪問 生活随笔!

生活随笔

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

java

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

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

Java緩存主要分為三種:

1、FIFO

2、LRU

3、LFU

它們一般應(yīng)用于瀏覽器中,使很多操作更加方便快捷。

1、FIFO:

FIFO是按存入的順序進(jìn)行排序的,如果命中緩存中的任意一個(gè)數(shù)據(jù),也不會(huì)破壞先進(jìn)先出的規(guī)則。如果新增了一個(gè)緩存之外的數(shù)據(jù),會(huì)把最先存入的數(shù)據(jù)移除。 先入先出,就和隊(duì)列一樣,先進(jìn)隊(duì)列的先出隊(duì)列。

import java.util.LinkedHashMap;public class FIFOCache<K,V> extends LinkedHashMap<K, V> {private static final long serialVersionUID = 436014030358073695L;private final int SIZE;public FIFOCache(int size) {super();SIZE = size;}@Overrideprotected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {return size() > SIZE;} }public class FIFOCacheTest {public static void main(String[] args) {FIFOCache<Integer, Integer> map = new FIFOCache<Integer, Integer>(10);for (int i = 0; i++ < 10;) {map.put(i, i);}System.out.println("起始存儲(chǔ)情況:"+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ù)被訪問命中就會(huì)按照LRU規(guī)則放到隊(duì)列最前面。如果新增一個(gè)不存在緩存的數(shù)據(jù),會(huì)把該數(shù)據(jù)放到最前面,同時(shí)移除最早訪問過的數(shù)據(jù)。

import java.util.LinkedHashMap;public class LRUCache<K,V> extends LinkedHashMap<K, V> {private static final long serialVersionUID = 5853563362972200456L;private final int SIZE;public LRUCache(int size) {super(size, 0.75f, true); SIZE = size;}@Overrideprotected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {return size() > SIZE;} } public class LRUCacheTest {public static void main(String[] args) {LRUCache<Integer, Integer> map = new LRUCache<Integer, Integer>(10);for (int i = 0; i++ < 10; ) {map.put(i, i); }System.out.println("起始存儲(chǔ)情況:"+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: 對(duì)存儲(chǔ)的數(shù)據(jù)都會(huì)有一個(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<Value>{ 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++;}@Overridepublic int compareTo(Value o) {if(o instanceof Value){ Value v = (Value) o;if(this.hitCount > v.hitCount)return 1;elsereturn -1;}return 0;}}final int SIZE;private Map<Object, Value> map = new HashMap<Object, Value>();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<Value> list = new ArrayList<Value>();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("起始存儲(chǔ)情況:"+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的緩存可以分為一級(jí)和二級(jí)緩存。

其中一級(jí)緩存也叫本地緩存;當(dāng)你要在一段時(shí)間內(nèi)獲取相同的數(shù)據(jù)時(shí),如果每次都去查詢數(shù)據(jù)庫,就會(huì)顯得特別麻煩,這時(shí)候一級(jí)緩存就派上了用場(chǎng),它能夠?qū)⑴c數(shù)據(jù)庫會(huì)話時(shí)查詢到的數(shù)據(jù)放在本地的緩存中,這時(shí)候要相同數(shù)據(jù)就可以直接從緩存中獲取,就省去很多麻煩。

二級(jí)緩存也叫作全局緩存。一個(gè)命名域?qū)?yīng)一個(gè)二級(jí)緩存,發(fā)生一個(gè)會(huì)話的時(shí)候查詢數(shù)據(jù)中的數(shù)據(jù),這個(gè)數(shù)據(jù)就會(huì)被保留在當(dāng)前的一級(jí)緩存中。當(dāng)會(huì)話關(guān)閉的時(shí)候一級(jí)緩存的數(shù)據(jù)就會(huì)被保存在二級(jí)緩存中;開始新會(huì)話的時(shí)候,如果要查詢新的信息就可以用二級(jí)緩存中的內(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);//從二級(jí)緩存中拿的數(shù)據(jù)System.out.println(emp02);openSession2.close();}finally{}}} 復(fù)制代碼

總結(jié)

以上是生活随笔為你收集整理的缓存框架(Java缓存)与框架缓存(介绍mybatis缓存)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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