重点是注释的部分:
使用redis:
package com.fangdd.esf.web.server.service.impl;
import com.fangdd.esf.customercommon.protocol.Entity.search.house.HouseFilterRequest;
import com.fangdd.esf.customercommon.protocol.Entity.search.house.HouseResult;
import com.fangdd.esf.customercommon.protocol.rest.response.SearchResponse;
import com.fangdd.esf.web.server.adapter.SearchAdapter;
import com.fangdd.esf.web.server.service.EstateSearchService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
//@CacheConfig(cacheNames = "EstateSearchService")
public class EstateSearchServiceImpl implements EstateSearchService {
private static final Logger logger = LoggerFactory.getLogger(EstateSearchServiceImpl.class);
@Autowired
private SearchAdapter searchAdapter;
// @Autowired
// private RedisTemplate objectRedisTemplate;
@Override
//@Cacheable(key = "'sectionsEstate_'+ #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 searchHouseByFilter(HouseFilterRequest filter, Integer type) {
/*
String key="sectionsEstate_"+ filter.getCompanyId()+"_"+filter.getCityId()+"_"+filter.getSectionIds();
boolean hasKey = objectRedisTemplate.hasKey(key);
if(hasKey){
SearchResponse res=new SearchResponse();
//反序列化成对象
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 li= Lists.newArrayList();
for(int i=0;i {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
@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("AgentAdapterCache", 1800L));
cacheManager.setExpires(ImmutableMap.of("AgentServiceImplCache", 2 * 60 * 60L));
cacheManager.setExpires(ImmutableMap.of("NccAdapterCache", 1800L));
cacheManager.setExpires(ImmutableMap.of("BrandBlockListInfo", 1800L));
}
cacheManager.setUsePrefix(true);
cacheManager.setCachePrefix(new CachePrefix(PREFIX, "_"));
return cacheManager;
}
@Override
public CacheErrorHandler errorHandler() {
return new CacheErrorHandler() {
@Override
public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
logger.error("cache get error, key = {}, ex = ", key, exception);
}
@Override
public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
logger.error("cache put error, key = {}, ex = ", key, exception);
}
@Override
public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
logger.error("cache evict error, key = {}, ex = ", key, exception);
}
@Override
public void handleCacheClearError(RuntimeException exception, Cache cache) {
logger.error("cache clear error, ex = ", exception);
}
};
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/*
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public RedisTemplate objectRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new FastJsonRedisSerializer(Object.class));
//template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
return template;
}
*/
@Bean
public RedisConnectionFactory redisConnectionFactory(
@Value("${spring.redis.host}") String host,
@Value("${spring.redis.port}") Integer port,
@Value("${spring.redis.pool.max-idle}") Integer maxIdle,
@Value("${spring.redis.pool.max-wait}") Long maxWaitMillis,
@Value("${spring.redis.pool.max-active}") Integer maxTotal,
@Value("${spring.redis.pool.min-idle}") Integer minIdle){
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(maxIdle);
config.setMaxWaitMillis(maxWaitMillis);
config.setMaxTotal(maxTotal);
config.setMinIdle(minIdle);
factory.setPoolConfig(config);
return factory;
}
}
class CachePrefix implements RedisCachePrefix {
private final RedisSerializer serializer = new StringRedisSerializer();
private final String delimiter;
private final String prefix;
public CachePrefix(String prefix, String delimiter) {
this.delimiter = delimiter;
this.prefix = prefix;
}
@Override
public byte[] prefix(String cacheName) {
return serializer.serialize(String.join(delimiter, prefix, cacheName, ""));
}
}