欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用Redis作為Mybatis的二級(jí)緩存

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

前言

今天在開發(fā)時(shí)發(fā)現(xiàn)一個(gè)奇怪的問題,我手動(dòng)改完數(shù)據(jù)庫(kù)竟然不生效,反復(fù)確認(rèn)環(huán)境無誤后猜測(cè)是緩存的問題,因?yàn)槭切陆邮值捻?xiàng)目,代碼還不熟悉,仔細(xì)一看,是開啟了二級(jí)緩存,并且存入Redis。

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

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

關(guān)于Mybatis-Plus的基礎(chǔ)設(shè)置就不多做介紹了,只說和二級(jí)緩存有關(guān)的。

首先在配置文件開啟二級(jí)緩存。

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

Redis配置

這部分就是Redis的基本用法:

  redis:
 ?  host: 101.411.160.111
 ?  database: 0
 ?  port: 6311
 ?  password: 1111111

配置RedisTemplate

@Configuration
public class RedisConfig {
 ? ?/**
 ? ? * 設(shè)置系列化方式、事務(wù)等配置
 ? ? */
 ? ?@Bean
 ? ?public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
 ?  {
 ? ? ? ?RedisTemplate<String,Serializable> redisTemplate = new RedisTemplate<>();
?
 ? ? ? ?redisTemplate.setConnectionFactory(lettuceConnectionFactory);
 ? ? ? ?//設(shè)置key序列化方式string
 ? ? ? ?redisTemplate.setKeySerializer(new StringRedisSerializer());
 ? ? ? ?//設(shè)置value的序列化方式j(luò)son
 ? ? ? ?redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
?
 ? ? ? ?redisTemplate.setHashKeySerializer(new StringRedisSerializer());
 ? ? ? ?redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
?
 ? ? ? ?redisTemplate.afterPropertiesSet();
?
 ? ? ? ?return redisTemplate;
 ?  }
}

自定義Mybatis緩存

我們只需要實(shí)現(xiàn)Cache這個(gè)接口。

@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("緩存出錯(cuò) ");
 ? ? ?  }
 ? ? ? ?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;
 ?  }
}

測(cè)試

1.第一次查詢,走數(shù)據(jù)庫(kù),并寫入緩存。

看看Redis的記錄:

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

3.重啟項(xiàng)目,依然可以直接查緩存

緩存命中率(Cache Hit Ratio)

不知道有沒有細(xì)心的同學(xué)注意到這樣一行日志:

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

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

一級(jí)緩存和二級(jí)緩存

一級(jí)緩存

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

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

二級(jí)緩存

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

什么時(shí)候該開啟二級(jí)緩存

說實(shí)話,我遇到開啟二級(jí)緩存的時(shí)候并不多,因?yàn)榫彺嬗欣灿斜住?/p>

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

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

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

相關(guān)文章

  • Redis分布式鎖實(shí)例分析講解

    Redis分布式鎖實(shí)例分析講解

    分布式鎖是控制分布式系統(tǒng)不同進(jìn)程共同訪問共享資源的一種鎖的實(shí)現(xiàn)。如果不同的系統(tǒng)或同一個(gè)系統(tǒng)的不同主機(jī)之間共享了某個(gè)臨界資源,往往需要互斥來防止彼此干擾,以保證一致性
    2022-12-12
  • Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法

    Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法

    Redis數(shù)據(jù)庫(kù)依賴于主存,在關(guān)系型數(shù)據(jù)庫(kù)以外再配套R(shí)edis管理緩存數(shù)據(jù)將對(duì)性能會(huì)有很大的提升,這里我們就來看一下Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法
    2016-06-06
  • 深入淺析Redis 集群伸縮原理

    深入淺析Redis 集群伸縮原理

    Redis 集群提供了靈活的節(jié)點(diǎn)擴(kuò)容和收縮方案。在不影響集群對(duì)外服務(wù)的情況下,可以為集群添加節(jié)點(diǎn)進(jìn)行擴(kuò)容,也可以下線部分節(jié)點(diǎn)進(jìn)行縮容,接下來通過本文給大家分享Redis 集群伸縮原理,感興趣的朋友一起看看吧
    2021-05-05
  • Redis如何正確關(guān)閉和開啟持久化

    Redis如何正確關(guān)閉和開啟持久化

    本文主要介紹了Redis如何正確關(guān)閉和開啟持久化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 基于redis分布式鎖實(shí)現(xiàn)秒殺功能

    基于redis分布式鎖實(shí)現(xiàn)秒殺功能

    這篇文章主要為大家詳細(xì)介紹了基于redis分布式鎖實(shí)現(xiàn)秒殺功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • redis cluster集群模式下實(shí)現(xiàn)批量可重入鎖

    redis cluster集群模式下實(shí)現(xiàn)批量可重入鎖

    本文主要介紹了使用redis cluster集群版所遇到的問題解決方案及redis可重入鎖是否會(huì)有死鎖的問題等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • windows 64位下redis安裝教程

    windows 64位下redis安裝教程

    這篇文章主要為大家詳細(xì)介紹了windows 64位下redis安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 大家都應(yīng)該知道的Redis過期鍵與過期策略

    大家都應(yīng)該知道的Redis過期鍵與過期策略

    這篇文章主要給大家介紹了一些應(yīng)該知道的Redis過期鍵與過期策略的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • redis的hash類型操作方法

    redis的hash類型操作方法

    Hash 是一個(gè) String 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象,這篇文章主要介紹了redis的hash類型的詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 將音頻文件轉(zhuǎn)二進(jìn)制分包存儲(chǔ)到Redis的實(shí)現(xiàn)方法(奇淫技巧操作)

    將音頻文件轉(zhuǎn)二進(jìn)制分包存儲(chǔ)到Redis的實(shí)現(xiàn)方法(奇淫技巧操作)

    這篇文章主要介紹了將音頻文件轉(zhuǎn)二進(jìn)制分包存儲(chǔ)到Redis的實(shí)現(xiàn)方法(奇淫技巧操作),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論