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);
}
publicMapgetExpiresMap(){
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());
ListcacheNames=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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。