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

作者:Mazhitaoooo 时间:2021-06-17 20:09:50 

介绍

使用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))

来源:http://blog.csdn.net/qq_38158631/article/details/78721794

标签:Spring,Boot,Mybatis,二级缓存
0
投稿

猜你喜欢

  • Java对xls文件进行读写操作示例代码

    2023-08-04 17:55:31
  • Java求两集合中元素交集的四种方法对比分析

    2023-08-23 09:24:56
  • Java实现最小生成树算法详解

    2023-11-25 04:51:22
  • IntelliJ IDEA 2017 汉化包及图文教程

    2023-11-25 12:17:58
  • Java CharacterEncodingFilter案例详解

    2022-03-21 18:22:32
  • 基于java枚举类综合应用的说明

    2023-02-16 09:39:25
  • @PathVariable和@RequestParam传参为空问题及解决

    2023-01-06 02:27:00
  • Java emoji持久化mysql过程详解

    2023-10-10 23:11:49
  • c语言10个经典小程序

    2023-11-03 01:11:35
  • Hibernate批量处理海量数据的方法

    2023-07-30 08:12:04
  • Java利用MultipartFile实现上传多份文件的代码

    2023-11-25 11:29:13
  • Java泛型定义与用法实例详解

    2023-11-25 11:50:28
  • Java 深入浅出掌握Collection单列集合Set

    2023-10-07 18:49:32
  • Java 集合概览(小结)

    2023-11-08 02:50:37
  • java Long类型转为json后数据损失精度的处理方式

    2022-08-11 12:37:43
  • Java实现注册登录与邮箱发送账号验证激活功能

    2023-11-05 09:21:57
  • 一篇文章带你入门Java基本概念

    2023-11-26 01:17:08
  • 理解java设计模式之建造者模式

    2023-03-13 14:48:55
  • mybatisPlus条件构造器常用方法小结

    2023-12-16 07:04:09
  • Java实现解出世界最难九宫格问题

    2022-06-14 19:47:10
  • asp之家 软件编程 m.aspxhome.com