最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用Redis作為Mybatis的二級緩存

 更新時間:2022年08月11日 09:39:30   作者:一條coding  
這篇文章主要介紹了如何利用Redis作為Mybatis的二級緩存,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下

前言

今天在開發(fā)時發(fā)現(xiàn)一個奇怪的問題,我手動改完數(shù)據(jù)庫竟然不生效,反復確認環(huán)境無誤后猜測是緩存的問題,因為是新接手的項目,代碼還不熟悉,仔細一看,是開啟了二級緩存,并且存入Redis。

那今天就聊聊怎么優(yōu)雅的用Redis作為Mybatis的二級緩存。

要優(yōu)雅就選擇Mybatis-Plus

關于Mybatis-Plus的基礎設置就不多做介紹了,只說和二級緩存有關的。

首先在配置文件開啟二級緩存。

mybatis-plus:
  configuration:
 ?  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 ?  cache-enabled: true ? # 開啟二級緩存
  mapper-locations: classpath:*/mapper/*.xml

Redis配置

這部分就是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;
 ?  }
}

自定義Mybatis緩存

我們只需要實現(xiàn)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.第一次查詢,走數(shù)據(jù)庫,并寫入緩存。

看看Redis的記錄:

2.第二次查詢,直接走緩存

3.重啟項目,依然可以直接查緩存

緩存命中率(Cache Hit Ratio)

不知道有沒有細心的同學注意到這樣一行日志:

Cache Hit Ratio [com.yitiao.mapper.ArticleMapper]: 0.5

最后這個0.5就是緩存命中率,代表一共查詢兩次,命中一次緩存一次。

一級緩存和二級緩存

一級緩存

一級緩存 Mybatis 的一級緩存是指 SQLSession,一級緩存的作用域是 SQlSession , Mabits 默認開啟一級緩存。 在同一個SqlSession中,執(zhí)行相同的SQL查詢時;第一次會去查詢數(shù)據(jù)庫,并寫在緩存中,第二次會直接從緩存中取。 當執(zhí)行SQL時候兩次查詢中間發(fā)生了增刪改的操作,則SQLSession的緩存會被清空。

每次查詢會先去緩存中找,如果找不到,再去數(shù)據(jù)庫查詢,然后把結(jié)果寫到緩存中。 Mybatis的內(nèi)部緩存使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結(jié)果集映射成的java對象。 SqlSession執(zhí)行insert、update、delete等操作commit后會清空該SQLSession緩存。

二級緩存

二級緩存 二級緩存是 mapper 級別的,Mybatis默認是沒有開啟二級緩存的。 第一次調(diào)用mapper下的SQL去查詢用戶的信息,查詢到的信息會存放到該 mapper 對應的二級緩存區(qū)域。 第二次調(diào)用 namespace 下的 mapper 映射文件中,相同的sql去查詢用戶信息,會去對應的二級緩存內(nèi)取結(jié)果。

什么時候該開啟二級緩存

說實話,我遇到開啟二級緩存的時候并不多,因為緩存有利也有弊。

我的建議是如果發(fā)現(xiàn)接口耗時嚴重,可以在線上開啟二級緩存,開發(fā)環(huán)境關掉,為什么呢?

就拿今天我遇到的事來說,開發(fā)直接改庫不能立即生效,就很煩。

到此這篇關于如何利用Redis作為Mybatis的二級緩存的文章就介紹到這了,更多相關Redis Mybatis二級緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Redis通用命令介紹以及key的層級結(jié)構(gòu)講解

    Redis通用命令介紹以及key的層級結(jié)構(gòu)講解

    這篇文章主要介紹了Redis通用命令以及key的層級結(jié)構(gòu),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • redis事務常用操作詳解

    redis事務常用操作詳解

    在本篇文章里小編給大家分享了關于redis事務常用操作的相關知識點內(nèi)容,有興趣的朋友們可以跟著學習參考下。
    2019-07-07
  • Redis實現(xiàn)布隆過濾器的方法及原理

    Redis實現(xiàn)布隆過濾器的方法及原理

    布隆過濾器優(yōu)點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。本文將介紹布隆過濾器的原理以及Redis如何實現(xiàn)布隆過濾器,感興趣的朋友跟隨小編一起看看吧
    2019-12-12
  • Linux 下redis5.0.0安裝教程詳解

    Linux 下redis5.0.0安裝教程詳解

    這篇文章主要介紹了Linux 下redis5.0.0安裝教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Redis報錯:Could not create server TCP listening socket 127.0.0.1:6379: bind:解決方法

    Redis報錯:Could not create server TCP 

    這篇文章主要介紹了Redis報錯:Could not create server TCP listening socket 127.0.0.1:6379: bind:解決方法,是安裝與啟動Redis過程中比較常見的問題,需要的朋友可以參考下
    2023-06-06
  • Redis類型type與編碼encoding原理及使用示例

    Redis類型type與編碼encoding原理及使用示例

    這篇文章主要為大家介紹了Redis類型type與編碼encoding原理及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例

    redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例

    這篇文章主要為大家介紹了redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 最新評論

    新泰市| 榆社县| 大埔县| 嘉峪关市| 宜兰市| 淮南市| 沈丘县| 丹凤县| 鲁山县| 于田县| 高淳县| 顺昌县| 潼关县| 缙云县| 都匀市| 山阴县| 台南市| 建昌县| 东城区| 惠州市| 闽侯县| 辽宁省| 尼木县| 沂源县| 疏附县| 来凤县| 互助| 亚东县| 商水县| 孟村| 古丈县| 方山县| 盐边县| 涿鹿县| 札达县| 利辛县| 汉阴县| 曲阜市| 广平县| 呼和浩特市| 西乌珠穆沁旗|