<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天在開發時發現一個奇怪的問題,我手動改完資料庫竟然不生效,反覆確認環境無誤後猜測是快取的問題,因為是新接手的專案,程式碼還不熟悉,仔細一看,是開啟了二級快取,並且存入Redis。
那今天就聊聊怎麼優雅的用Redis作為Mybatis的二級快取。
關於Mybatis-Plus的基礎設定就不多做介紹了,只說和二級快取有關的。
首先在組態檔開啟二級快取。
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl cache-enabled: true # 開啟二級快取 mapper-locations: classpath:*/mapper/*.xml
這部分就是Redis的基本用法:
redis: host: 101.411.160.111 database: 0 port: 6311 password: 1111111
設定RedisTemplate
@Configuration public class RedisConfig { /** * 設定系列化方式、事務等設定 */ @Bean public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate<String,Serializable> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); //設定key序列化方式string redisTemplate.setKeySerializer(new StringRedisSerializer()); //設定value的序列化方式json redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
我們只需要實現Cache
這個介面。
@Slf4j public class MybatisRedisCache implements Cache { private static final String COMMON_CACHE_KEY = "mybatis"; // 讀寫鎖 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true) private final RedisTemplate<String, Object> redisTemplate; private final String nameSpace; public MybatisRedisCache(String nameSpace) { if (nameSpace == null) { throw new IllegalArgumentException("Cache instances require an ID"); } redisTemplate = SpringUtil.getBean("redisTemplate"); this.nameSpace = nameSpace; } @Override public String getId() { return this.nameSpace; } private String getKeys() { return COMMON_CACHE_KEY + "::" + nameSpace + "::*"; } private String getKey(Object key) { return COMMON_CACHE_KEY + "::" + nameSpace + "::" + DigestUtils.md5Hex(String.valueOf(key)); } @Override public void putObject(Object key, Object value) { redisTemplate.opsForValue().set(getKey(key), value, 10, TimeUnit.MINUTES); } @Override public Object getObject(Object key) { try { return redisTemplate.opsForValue().get(getKey(key)); } catch (Exception e) { e.printStackTrace(); log.error("快取出錯 "); } return null; } @Override public Object removeObject(Object o) { Object n = redisTemplate.opsForValue().get(getKey(o)); redisTemplate.delete(getKey(o)); return n; } @Override public void clear() { Set<String> keys = redisTemplate.keys(getKeys()); if (CollectionUtil.isNotEmpty(keys)) { assert keys != null; redisTemplate.delete(keys); } } @Override public int getSize() { Set<String> keys = redisTemplate.keys(getKeys()); if (CollectionUtil.isNotEmpty(keys)) { assert keys != null; return keys.size(); } return 0; } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } }
1.第一次查詢,走資料庫,並寫入快取。
看看Redis的記錄:
2.第二次查詢,直接走快取
3.重啟專案,依然可以直接查快取
不知道有沒有細心的同學注意到這樣一行紀錄檔:
Cache Hit Ratio [com.yitiao.mapper.ArticleMapper]: 0.5
最後這個0.5就是快取命中率,代表一共查詢兩次,命中一次快取一次。
一級快取
一級快取 Mybatis 的一級快取是指 SQLSession,一級快取的作用域是 SQlSession , Mabits 預設開啟一級快取。 在同一個SqlSession中,執行相同的SQL查詢時;第一次會去查詢資料庫,並寫在快取中,第二次會直接從快取中取。 當執行SQL時候兩次查詢中間發生了增刪改的操作,則SQLSession的快取會被清空。
每次查詢會先去快取中找,如果找不到,再去資料庫查詢,然後把結果寫到快取中。 Mybatis的內部快取使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結果集對映成的java物件。 SqlSession執行insert、update、delete等操作commit後會清空該SQLSession快取。
二級快取
二級快取 二級快取是 mapper 級別的,Mybatis預設是沒有開啟二級快取的。 第一次呼叫mapper下的SQL去查詢使用者的資訊,查詢到的資訊會存放到該 mapper 對應的二級快取區域。 第二次呼叫 namespace 下的 mapper 對映檔案中,相同的sql去查詢使用者資訊,會去對應的二級快取內取結果。
說實話,我遇到開啟二級快取的時候並不多,因為快取有利也有弊。
我的建議是如果發現介面耗時嚴重,可以線上上開啟二級快取,開發環境關掉,為什麼呢?
就拿今天我遇到的事來說,開發直接改庫不能立即生效,就很煩。
到此這篇關於如何利用Redis作為Mybatis的二級快取的文章就介紹到這了,更多相關Redis Mybatis二級快取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45