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接口,具体内容如下
packagecom.ruijie.SpringBootandRedis.cache;
importorg.springframework.beans.BeansException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
importorg.springframework.stereotype.Component;
@Component
publicclassApplicationContextHolderimplementsApplicationContextAware{
privatestaticApplicationContextapplicationContext;
@Override
publicvoidsetApplicationContext(ApplicationContextctx)throwsBeansException{
applicationContext=ctx;
}
/**
*Getapplicationcontextfromeverywhere
*
*@return
*/
publicstaticApplicationContextgetApplicationContext(){
returnapplicationContext;
}
/**
*Getbeanbyclass
*
*@paramclazz
*@param
*@return
*/
publicstaticTgetBean(Classclazz){
returnapplicationContext.getBean(clazz);
}
/**
*Getbeanbyclassname
*
*@paramname
*@param
*@return
*/
publicstaticTgetBean(Stringname){
return(T)applicationContext.getBean(name);
}
}
     
4.创建RedisCache类实现Cache接口,具体内容如下:
packagecom.ruijie.SpringBootandRedis.cache;
importorg.apache.ibatis.cache.Cache;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.data.redis.core.RedisCallback;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.data.redis.core.ValueOperations;
importjava.util.concurrent.TimeUnit;
importjava.util.concurrent.locks.ReadWriteLock;
importjava.util.concurrent.locks.ReentrantReadWriteLock;
publicclassRedisCacheimplementsCache{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(RedisCache.class);
privatefinalReadWriteLockreadWriteLock=newReentrantReadWriteLock();
privatefinalStringid;//cacheinstanceid
privateRedisTemplateredisTemplate;
privatestaticfinallongEXPIRE_TIME_IN_MINUTES=30;//redis过期时间
publicRedisCache(Stringid){
if(id==null){
thrownewIllegalArgumentException("CacheinstancesrequireanID");
}
this.id=id;
}
@Override
publicStringgetId(){
returnid;
}
/**
*Putqueryresulttoredis
*
*@paramkey
*@paramvalue
*/
@Override
publicvoidputObject(Objectkey,Objectvalue){
try{
RedisTemplateredisTemplate=getRedisTemplate();
ValueOperationsopsForValue=redisTemplate.opsForValue();
opsForValue.set(key,value,EXPIRE_TIME_IN_MINUTES,TimeUnit.MINUTES);
logger.debug("Putqueryresulttoredis");
}
catch(Throwablet){
logger.error("Redisputfailed",t);
}
}
/**
*Getcachedqueryresultfromredis
*
*@paramkey
*@return
*/
@Override
publicObjectgetObject(Objectkey){
try{
RedisTemplateredisTemplate=getRedisTemplate();
ValueOperationsopsForValue=redisTemplate.opsForValue();
logger.debug("Getcachedqueryresultfromredis");
System.out.println("****"+opsForValue.get(key).toString());
returnopsForValue.get(key);
}
catch(Throwablet){
logger.error("Redisgetfailed,failovertodb",t);
returnnull;
}
}
/**
*Removecachedqueryresultfromredis
*
*@paramkey
*@return
*/
@Override
@SuppressWarnings("unchecked")
publicObjectremoveObject(Objectkey){
try{
RedisTemplateredisTemplate=getRedisTemplate();
redisTemplate.delete(key);
logger.debug("Removecachedqueryresultfromredis");
}
catch(Throwablet){
logger.error("Redisremovefailed",t);
}
returnnull;
}
/**
*Clearsthiscacheinstance
*/
@Override
publicvoidclear(){
RedisTemplateredisTemplate=getRedisTemplate();
redisTemplate.execute((RedisCallback)connection->{
connection.flushDb();
returnnull;
});
logger.debug("Clearallthecachedqueryresultfromredis");
}
/**
*Thismethodisnotused
*
*@return
*/
@Override
publicintgetSize(){
return0;
}
@Override
publicReadWriteLockgetReadWriteLock(){
returnreadWriteLock;
}
privateRedisTemplategetRedisTemplate(){
if(redisTemplate==null){
redisTemplate=ApplicationContextHolder.getBean("redisTemplate");
}
returnredisTemplate;
}
}
5.实体类中要实现Serializable接口,并且要声明序列号
privatestaticfinallongserialVersionUID=-2566441764189220519L;
6.开启Mybatis的二级缓存
在pom.xml配置文件中配置
mybatis.configuration.cache-enabled=true
在mapper接口中加入
@CacheNamespace(implementation=(com.demo.testdemo.cache.RedisCache.class))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。