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 */ publicstatic TgetBean(Class clazz){ returnapplicationContext.getBean(clazz); } /** *Getbeanbyclassname * *@paramname *@param *@return */ publicstatic TgetBean(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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。