栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+Mybatis项目使用Redis做Mybatis的二级缓存的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+Mybatis项目使用Redis做Mybatis的二级缓存的方法

介绍

使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验。

使用redis做mybatis的二级缓存可是内存可控<如将单独的服务器部署出来用于二级缓存>,管理方便。

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


  org.springframework.boot
  spring-boot-starter-data-redis

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;
  }

  
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  
  public static  T getBean(Class clazz) {
    return applicationContext.getBean(clazz);
  }

  
  public static  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;
  }

  
  @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);
    }
  }

  
  @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;
    }
  }

  
  @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;
  }

  
  @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");
  }

  
  @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))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号