中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot+Mybatis項目中如何使用Redis做Mybatis的二級緩存

發布時間:2021-07-08 11:33:20 來源:億速云 閱讀:300 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關SpringBoot+Mybatis項目中如何使用Redis做Mybatis的二級緩存的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

介紹

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

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

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.創建cache包,然后創建兩個類,一個ApplicationContextHolder實現ApplicationContextAware接口,具體內容如下

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.創建RedisCache類實現Cache接口,具體內容如下:

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.實體類中要實現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))

感謝各位的閱讀!關于“SpringBoot+Mybatis項目中如何使用Redis做Mybatis的二級緩存”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杨浦区| 曲麻莱县| 电白县| 焉耆| 扶绥县| 呼和浩特市| 赣州市| 太仆寺旗| 广河县| 行唐县| 嘉定区| 鄂温| 门头沟区| 正阳县| 抚州市| 虞城县| 咸丰县| 通江县| 邛崃市| 仙桃市| 宝丰县| 突泉县| 绥江县| 阳新县| 望都县| 年辖:市辖区| 寻甸| 红河县| 肇州县| 称多县| 云霄县| 同心县| 安福县| 四川省| 澎湖县| 漠河县| 孟津县| 岚皋县| 大同县| 鄂伦春自治旗| 黔西县|