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

网友投稿 304 2023-03-06


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 XFKaqCFEApplicationContextAware {

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

* @return

*/

public static T getBean(Class clazz) {

return applicationContext.getBean(clazz);

}

/**

* Get bean by class name

*

* @param name

* @param

* @return

*/

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;

}

/**

* 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 reahttp://dWriteLock;

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:物联网api网关开源(物联网网关的应用部署)
下一篇:用户管理api(用户管理系统登录)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~