1.导入依赖
2.redisconfig编写
2.1 cacheManager
@SuppressWarnings("rawtypes")
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
String env = settings.getEnvironment();
if ("dev".equals(env) || "test".equals(env) || "pre".equals(env)) {
cacheManager.setDefaultExpiration(10);
} else {
cacheManager.setDefaultExpiration(1800);
cacheManager.setExpires(ImmutableMap.of("wechatMiniProgram", 2 * 60 * 60L));
cacheManager.setExpires(ImmutableMap.of("xxxAdapterCache", 1800L));
cacheManager.setExpires(ImmutableMap.of("xxxServiceImplCache", 2 * 60 * 60L));
cacheManager.setExpires(ImmutableMap.of("xxxxAdapterCache", 1800L));
cacheManager.setExpires(ImmutableMap.of("xxxxSearchService", 1800L)); //是否合理???
}
cacheManager.setUsePrefix(true);
cacheManager.setCachePrefix(new CachePrefix(PREFIX, "_"));
return cacheManager;
}
2.2 自定义RedisTemplate<String, Object> objectRedisTemplate(RedisConnectionFactory factory)
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public RedisTemplate<String, Object> objectRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new FastJsonRedisSerializer<Object>(Object.class));
//template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
return template;
}
3.使用
@Autowired
private RedisTemplate<String, Object> objectRedisTemplate;
@Override
//@Cacheable(key = "'sections_'+ #filter.getCompanyId()+'_'+#filter.getCityId()+'_'+#filter.getSectionIds()", condition = "#filter.getCompanyId() != null && #filter.getCityId() != null && #filter.getSectionIds() != null",value="EstateSearchService#180#60",unless = "#result == null") //#${select.cache.timeout:1000}
public SearchResponse<Result> searchByFilter(FilterRequest filter, Integer type) {
String key="sections_"+ filter.getCompanyId()+"_"+filter.getCityId()+"_"+filter.getSectionIds();
boolean hasKey = objectRedisTemplate.hasKey(key);
if(hasKey){
SearchResponse<Result> res=new SearchResponse<Result>();
//反序列化成对象
JSONObject obj=(JSONObject)objectRedisTemplate.opsForValue().get(key); //com.alibaba.fastjson.JSONObject
JSONArray jsonArray = obj.getJSONArray("records");
Long total=obj.getLong("total");
Long recommendTotal=obj.getLong("recommendTotal");
List<Result> li= Lists.newArrayList();
for(int i=0;i<jsonArray.size();i++){
li.add(jsonArray.getObject(i,Result.class));
}
res.setRecommendTotal(recommendTotal);
res.setRecords(li);
res.setTotal(total);
return res;
}
long startTime = System.currentTimeMillis();
logger.warn("搜索请求开始: {}",startTime);
//搜索
SearchResponse<Result> hSearchResponse = searchByFilter(filter);
List<Result> hList = hSearchResponse.getRecords();
hSearchResponse.setRecommendTotal(new Long(hList.size()));
startTime = System.currentTimeMillis();
logger.warn("房源搜索请求结束: {}",startTime);
objectRedisTemplate.opsForValue().set(key,hSearchResponse);
this.objectRedisTemplate.expire(key,1000,TimeUnit.SECONDS); //过期时间
return hSearchResponse;
}
注意:带泛型,不能直接从redis取出的JSONObject对象直接转成bean对象,需要有确定的类型,可以先取出再拼装;