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