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

SpringBoot+Mybatis項目使用Redis做Mybatis的二級緩存的方法

 更新時間:2017年12月11日 09:50:24   作者:Mazhitaoooo  
本篇文章主要介紹了SpringBoot+Mybatis項目使用Redis做Mybatis的二級緩存的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

介紹

使用mybatis時可以使用二級緩存提高查詢速度,進而改善用戶體驗。

使用redis做mybatis的二級緩存可是內(nèi)存可控<如將單獨的服務(wù)器部署出來用于二級緩存>,管理方便。

1.在pom.xml文件中引入redis依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.在application.properties配置文件中進行redis的配置

## Redis 
spring.redis.database=0
spring.redis.host=172.16.3.123
spring.redis.port=6379
spring.redis.password=
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=0

3.創(chuàng)建cache包,然后創(chuàng)建兩個類,一個ApplicationContextHolder實現(xiàn)ApplicationContextAware接口,具體內(nèi)容如下

package com.ruijie.SpringBootandRedis.cache;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
  private static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    applicationContext = ctx;
  }

  /**
   * Get application context from everywhere
   *
   * @return
   */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  /**
   * Get bean by class
   *
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T getBean(Class<T> clazz) {
    return applicationContext.getBean(clazz);
  }

  /**
   * Get bean by class name
   *
   * @param name
   * @param <T>
   * @return
   */
  public static <T> T getBean(String name) {
    return (T) applicationContext.getBean(name);
  }
}

4.創(chuàng)建RedisCache類實現(xiàn)Cache接口,具體內(nèi)容如下:

package com.ruijie.SpringBootandRedis.cache;
import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class RedisCache implements Cache {
  private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
  private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  private final String id; // cache instance id
  private RedisTemplate redisTemplate;
  private static final long EXPIRE_TIME_IN_MINUTES = 30; // redis過期時間
  public RedisCache(String id) {
    if (id == null) {
      throw new IllegalArgumentException("Cache instances require an ID");
    }
    this.id = id;
  }

  @Override
  public String getId() {
    return id;
  }

  /**
   * Put query result to redis
   *
   * @param key
   * @param value
   */
  @Override
  public void putObject(Object key, Object value) {
    try {
      RedisTemplate redisTemplate = getRedisTemplate();
      ValueOperations opsForValue = redisTemplate.opsForValue();
      opsForValue.set(key, value, EXPIRE_TIME_IN_MINUTES, TimeUnit.MINUTES);
      logger.debug("Put query result to redis");
    }
    catch (Throwable t) {
      logger.error("Redis put failed", t);
    }
  }

  /**
   * Get cached query result from redis
   *
   * @param key
   * @return
   */
  @Override
  public Object getObject(Object key) {
    try {

      RedisTemplate redisTemplate = getRedisTemplate();
      ValueOperations opsForValue = redisTemplate.opsForValue();
      logger.debug("Get cached query result from redis");
      System.out.println("****"+opsForValue.get(key).toString());
      return opsForValue.get(key);
    }
    catch (Throwable t) {
      logger.error("Redis get failed, fail over to db", t);
      return null;
    }
  }

  /**
   * Remove cached query result from redis
   *
   * @param key
   * @return
   */
  @Override
  @SuppressWarnings("unchecked")
  public Object removeObject(Object key) {
    try {
      RedisTemplate redisTemplate = getRedisTemplate();
      redisTemplate.delete(key);
      logger.debug("Remove cached query result from redis");
    }
    catch (Throwable t) {
      logger.error("Redis remove failed", t);
    }
    return null;
  }

  /**
   * Clears this cache instance
   */
  @Override
  public void clear() {
    RedisTemplate redisTemplate = getRedisTemplate();
    redisTemplate.execute((RedisCallback) connection -> {
      connection.flushDb();
      return null;
    });
    logger.debug("Clear all the cached query result from redis");
  }

  /**
   * This method is not used
   *
   * @return
   */
  @Override
  public int getSize() {
    return 0;
  }

  @Override
  public ReadWriteLock getReadWriteLock() {
    return readWriteLock;
  }

  private RedisTemplate getRedisTemplate() {
    if (redisTemplate == null) {
      redisTemplate = ApplicationContextHolder.getBean("redisTemplate");
    }
    return redisTemplate;
  }
}

5.實體類中要實現(xiàn)Serializable接口,并且要聲明序列號

private static final long serialVersionUID = -2566441764189220519L;

6.開啟Mybatis的二級緩存

在pom.xml配置文件中配置

mybatis.configuration.cache-enabled=true

在mapper接口中加入

@CacheNamespace(implementation=(com.demo.testdemo.cache.RedisCache.class))

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis調(diào)用存儲過程的案例

    Mybatis調(diào)用存儲過程的案例

    這篇文章主要介紹了Mybatis如何調(diào)用存儲過程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • mybatis逆向工程與分頁在springboot中的應(yīng)用及遇到坑

    mybatis逆向工程與分頁在springboot中的應(yīng)用及遇到坑

    最近在項目中應(yīng)用到springboot與mybatis,在進行整合過程中遇到一些坑,在此將其整理出來,分享到腳本之家平臺供大家參考下
    2018-09-09
  • Mybatis使用update更新值為null時不生效問題解決

    Mybatis使用update更新值為null時不生效問題解決

    這篇文章主要介紹了Mybatis使用update更新值為null時不生效問題解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • java右下角彈窗示例分享

    java右下角彈窗示例分享

    這篇文章主要介紹了java右下角彈窗示例,需要的朋友可以參考下
    2014-04-04
  • MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作

    MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作

    這篇文章主要介紹了MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 淺談Java代碼的 微信長鏈轉(zhuǎn)短鏈接口使用 post 請求封裝Json(實例)

    淺談Java代碼的 微信長鏈轉(zhuǎn)短鏈接口使用 post 請求封裝Json(實例)

    下面小編就為大家?guī)硪黄獪\談Java代碼的 微信長鏈轉(zhuǎn)短鏈接口使用 post 請求封裝Json(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • MyBatis?Mapper.XML?標(biāo)簽使用小結(jié)

    MyBatis?Mapper.XML?標(biāo)簽使用小結(jié)

    在MyBatis中,通過resultMap可以解決字段名和屬性名不一致的問題,對于復(fù)雜的查詢,引用實體或使用<sql>標(biāo)簽可以定義復(fù)用的SQL片段,提高代碼的可讀性和編碼效率,使用這些高級映射和動態(tài)SQL技巧,可以有效地處理復(fù)雜的數(shù)據(jù)庫交互場景
    2024-10-10
  • 了解Java線程池執(zhí)行原理

    了解Java線程池執(zhí)行原理

    那么有沒有一種辦法使得線程可以復(fù)用,就是執(zhí)行完一個任務(wù),并不被銷毀,而是可以繼續(xù)執(zhí)行其他的任務(wù)?在Java中可以通過線程池來達(dá)到這樣的效果。下面我們來詳細(xì)了解一下吧
    2019-05-05
  • spring?boot項目中如何使用nacos作為配置中心

    spring?boot項目中如何使用nacos作為配置中心

    這篇文章主要介紹了spring?boot項目中如何使用nacos作為配置中心問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java中Map集合中的Entry對象用法

    Java中Map集合中的Entry對象用法

    這篇文章主要介紹了Java中Map集合中的Entry對象用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論