Spring Boot 基于注解的 Redis 缓存使用详解
看文本之前,请先确定你看过上一篇文章《SpringBootRedis集成配置》并保证Redis集成后正常可用,因为本文是基于上文继续增加的代码。
一、创建Caching配置类
RedisKeys.Java
packagecom.shanhy.example.redis; importjava.util.HashMap; importjava.util.Map; importjavax.annotation.PostConstruct; importorg.springframework.stereotype.Component; /** *方法缓存key常量 * *@authorSHANHY */ @Component publicclassRedisKeys{ //测试begin publicstaticfinalString_CACHE_TEST="_cache_test";//缓存key publicstaticfinalLong_CACHE_TEST_SECOND=20L;//缓存时间 //测试end //根据key设定具体的缓存时间 privateMapexpiresMap=null; @PostConstruct publicvoidinit(){ expiresMap=newHashMap<>(); expiresMap.put(_CACHE_TEST,_CACHE_TEST_SECOND); } publicMap getExpiresMap(){ returnthis.expiresMap; } }
CachingConfig.java
packagecom.shanhy.example.redis; importjava.lang.reflect.Method; importjava.util.ArrayList; importjava.util.List; importorg.springframework.cache.CacheManager; importorg.springframework.cache.annotation.CachingConfigurerSupport; importorg.springframework.cache.annotation.EnableCaching; importorg.springframework.cache.interceptor.KeyGenerator; importorg.springframework.cache.interceptor.SimpleKeyGenerator; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.data.redis.cache.RedisCacheManager; importorg.springframework.data.redis.core.RedisTemplate; /** *注解式环境管理 * *@author单红宇(CSDNcatoop) *@create2016年9月12日 */ @Configuration @EnableCaching publicclassCachingConfigextendsCachingConfigurerSupport{ /** *在使用@Cacheable时,如果不指定key,则使用找个默认的key生成器生成的key * *@return * *@author单红宇(CSDNCATOOP) *@create2017年3月11日 */ @Override publicKeyGeneratorkeyGenerator(){ returnnewSimpleKeyGenerator(){ /** *对参数进行拼接后MD5 */ @Override publicObjectgenerate(Objecttarget,Methodmethod,Object...params){ StringBuildersb=newStringBuilder(); sb.append(target.getClass().getName()); sb.append(".").append(method.getName()); StringBuilderparamsSb=newStringBuilder(); for(Objectparam:params){ //如果不指定,默认生成包含到键值中 if(param!=null){ paramsSb.append(param.toString()); } } if(paramsSb.length()>0){ sb.append("_").append(paramsSb); } returnsb.toString(); } }; } /** *管理缓存 * *@paramredisTemplate *@return */ @Bean publicCacheManagercacheManager(RedisTemplateredisTemplate,RedisKeysredisKeys){ RedisCacheManagerrcm=newRedisCacheManager(redisTemplate); //设置缓存默认过期时间(全局的) rcm.setDefaultExpiration(1800);//30分钟 //根据key设定具体的缓存时间,key统一放在常量类RedisKeys中 rcm.setExpires(redisKeys.getExpiresMap()); List cacheNames=newArrayList (redisKeys.getExpiresMap().keySet()); rcm.setCacheNames(cacheNames); returnrcm; } }
二、创建需要缓存数据的类
TestService.java
packagecom.shanhy.example.service; importorg.apache.commons.lang3.RandomStringUtils; importorg.springframework.cache.annotation.Cacheable; importorg.springframework.stereotype.Service; importcom.shanhy.example.redis.RedisKeys; @Service publicclassTestService{ /** *固定key * *@return *@authorSHANHY *@create2017年4月9日 */ @Cacheable(value=RedisKeys._CACHE_TEST,key="'"+RedisKeys._CACHE_TEST+"'") publicStringtestCache(){ returnRandomStringUtils.randomNumeric(4); } /** *存储在Redis中的key自动生成,生成规则详见CachingConfig.keyGenerator()方法 * *@paramstr1 *@paramstr2 *@return *@authorSHANHY *@create2017年4月9日 */ @Cacheable(value=RedisKeys._CACHE_TEST) publicStringtestCache2(Stringstr1,Stringstr2){ returnRandomStringUtils.randomNumeric(4); } }
说明一下,其中@Cacheable中的value值是在CachingConfig的cacheManager中配置的,那里是为了配置我们的缓存有效时间。其中methodKeyGenerator为CachingConfig中声明的KeyGenerator。
另外,Cache相关的注解还有几个,大家可以了解下,不过我们常用的就是@Cacheable,一般情况也可以满足我们的大部分需求了。还有@Cacheable也可以配置表达式根据我们传递的参数值判断是否需要缓存。
注:TestService中testCache中的mapper.get大家不用关心,这里面我只是访问了一下数据库而已,你只需要在这里做自己的业务代码即可。
三、测试方法
下面代码,随便放一个Controller中
packagecom.shanhy.example.controller; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.data.redis.connection.jedis.RedisClient; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importcom.shanhy.example.service.TestService; /** *测试Controller * *@author单红宇(365384722) *@create2017年4月9日 */ @RestController @RequestMapping("/test") publicclassTestController{ privatestaticfinalLoggerLOG=LoggerFactory.getLogger(TestController.class); @Autowired privateRedisClientredisClient; @Autowired privateTestServicetestService; @GetMapping("/redisCache") publicStringredisCache(){ redisClient.set("shanhy","hello,shanhy",100); LOG.info("getRedisValue={}",redisClient.get("shanhy")); testService.testCache2("aaa","bbb"); returntestService.testCache(); } }
至此完毕!
最后说一下,这个@Cacheable基本是可以放在所有方法上的,Controller的方法上也是可以的(这个我没有测试^_^)。
源码下载地址:http://git.oschina.net/catoop/springboot-cache-redis
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。