Authored by hugufei

去除CacheObject中的JSONObject类型

... ... @@ -61,9 +61,7 @@ public class SearchCacheAspect {
// 4、缓存获取
SearchCache searchCache = searchCacheFactory.getAspectSearhCache(searchCacheAble);
//boolean useJsonSerializable = searchCacheAble.cacheType().equals(CacheType.EHCACHE) ? false : true;
boolean useJsonSerializable = true;
T result = searchCacheService.getSerializableObjectFromCache(searchCache, redisKeyBuilder, type, useJsonSerializable);
T result = searchCacheService.getSerializableObjectFromCache(searchCache, redisKeyBuilder, type);
if (result != null) {
return result;
}
... ... @@ -78,7 +76,7 @@ public class SearchCacheAspect {
}
//6、加入缓存
searchCacheService.addSerializableObjectToCache(searchCache, redisKeyBuilder, result, useJsonSerializable);
searchCacheService.addSerializableObjectToCache(searchCache, redisKeyBuilder, result);
return result;
}
... ...
... ... @@ -15,43 +15,35 @@ import java.util.concurrent.ConcurrentHashMap;
@Service
public class SearchCacheFactory {
@Autowired
private EhCache ehCache;
@Autowired
private SearchRedis searchRedis;
private Map<String, SearchCache> cacheMap = new ConcurrentHashMap<String, SearchCache>();
private CacheInterface getCacheInterface(CacheType cacheType) {
if (cacheType == CacheType.EHCACHE) {
return ehCache;
}
if (cacheType == CacheType.SEARCH_REDIS) {
return searchRedis;
}
return null;
}
private SearchCache getOrCreateSearchCache(String cacheKey, CacheType cacheType, int cacheInMinute) {
CacheInterface cacheInterface = this.getCacheInterface(cacheType);
String cacheName = new StringBuilder(cacheKey).append("_").append(cacheType.name()).append("_").append(cacheInMinute).toString();
return cacheMap.computeIfAbsent(cacheName, key -> new SearchCache(cacheName, cacheInterface, cacheInMinute));
}
/**
* 推荐缓存
* @return
*/
public SearchCache getRecommendCache() {
return this.getOrCreateSearchCache("RECOMMEND", CacheType.SEARCH_REDIS, 15);
}
/**
* aop的缓存
*
* @return
*/
public SearchCache getAspectSearhCache(SearchCacheAble searchCacheAble) {
return this.getOrCreateSearchCache("AOP_" + searchCacheAble.cacheName(), CacheType.SEARCH_REDIS, searchCacheAble.cacheInMinute().getMinute());
}
@Autowired
private EhCache ehCache;
@Autowired
private SearchRedis searchRedis;
private Map<String, SearchCache> cacheMap = new ConcurrentHashMap<String, SearchCache>();
private CacheInterface getCacheInterface(CacheType cacheType) {
if (cacheType == CacheType.EHCACHE) {
return ehCache;
}
if (cacheType == CacheType.SEARCH_REDIS) {
return searchRedis;
}
return null;
}
private SearchCache getOrCreateSearchCache(String cacheKey, CacheType cacheType, int cacheInMinute) {
CacheInterface cacheInterface = this.getCacheInterface(cacheType);
String cacheName = new StringBuilder(cacheKey).append("_").append(cacheType.name()).append("_").append(cacheInMinute).toString();
return cacheMap.computeIfAbsent(cacheName, key -> new SearchCache(cacheName, cacheInterface, cacheInMinute));
}
/**
* aop的缓存
*
* @return
*/
public SearchCache getAspectSearhCache(SearchCacheAble searchCacheAble) {
return this.getOrCreateSearchCache("AOP_" + searchCacheAble.cacheName(), CacheType.SEARCH_REDIS, searchCacheAble.cacheInMinute().getMinute());
}
}
... ...
package com.yoho.search.cache.beans;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
import com.yoho.search.base.utils.MD5Util;
import com.yoho.search.cache.model.CacheObject;
import com.yoho.search.cache.model.SearchCache;
import com.yoho.search.common.SearchServiceConfiger;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.utils.SearchParamUtils;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -19,6 +16,8 @@ import java.lang.reflect.Type;
@Service
public class SearchCacheService {
private static final Logger logger = LoggerFactory.getLogger(SearchCacheService.class);
@Autowired
private SearchServiceConfiger searchServiceConfiger;
... ... @@ -32,12 +31,7 @@ public class SearchCacheService {
return;
}
// 3、加入缓存
CacheObject cacheObject = null;
if (object instanceof JSONObject) {
cacheObject = new CacheObject((JSONObject) object);
} else {
cacheObject = new CacheObject(object);
}
CacheObject cacheObject = new CacheObject(object);
searchCache.getCache().addOrUpdate(redisKeyBuilder, cacheObject, searchCache.getCacheInMinute());
}
... ... @@ -71,62 +65,22 @@ public class SearchCacheService {
return cacheObject;
}
/*********************************** JSONObject *****************************************/
private RedisKeyBuilder genSearchParamString(String indexName, SearchParam searchParam) {
//1、拼装内容
StringBuilder redisKeyValue = new StringBuilder();
redisKeyValue.append("indexName:").append(indexName).append(';');
redisKeyValue.append("searchType:").append(searchParam.getSearchType() == null ? "" : searchParam.getSearchType().name()).append(';');
SearchSourceBuilder searchSourceBuilder = SearchParamUtils.genSearchSourceBuilderFromSearchParam(searchParam);
redisKeyValue.append("searchSource:").append(searchSourceBuilder).append(';');
//2、构建RedisKeyBuilder
RedisKeyBuilder redisKeyBuilder = RedisKeyBuilder.newInstance();
redisKeyBuilder.appendFixed("YOHOSEARCH:");
redisKeyBuilder.appendFixed("DEFAULT1:");
redisKeyBuilder.appendVar(MD5Util.string2MD5(redisKeyValue.toString()));
return redisKeyBuilder;
}
public void addJSONObjectToCache(SearchCache searchCache, String indexName, SearchParam searchParam, JSONObject jsonObject) {
RedisKeyBuilder key = this.genSearchParamString(indexName, searchParam);
this.addObjectToCache(key, jsonObject, searchCache);
}
public JSONObject getJSONObjectFromCache(SearchCache searchCache, String indexName, SearchParam searchParam) {
RedisKeyBuilder key = this.genSearchParamString(indexName, searchParam);
CacheObject cacheObject = this.getCacheObjectFromCache(key, searchCache);
if (cacheObject == null) {
return null;
}
return cacheObject.toJSONObject();
}
/*********************************** object *****************************************/
public <T> T getSerializableObjectFromCache(SearchCache searchCache, RedisKeyBuilder redisKeyBuilder, Type type, boolean useJsonSerializable) {
public <T> T getSerializableObjectFromCache(SearchCache searchCache, RedisKeyBuilder redisKeyBuilder, Type type) {
try {
CacheObject cacheObject = this.getCacheObjectFromCache(redisKeyBuilder, searchCache);
if (cacheObject == null) {
return null;
}
if (useJsonSerializable) {
String stringValue = (String) cacheObject.toObject();
return JSON.parseObject(stringValue, type);
} else {
return (T) cacheObject.getValue();
}
String stringValue = (String) cacheObject.toObject();
return JSON.parseObject(stringValue, type);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(),e);
return null;
}
}
public <T> void addSerializableObjectToCache(SearchCache searchCache, RedisKeyBuilder redisKeyBuilder, T object, boolean useJsonSerializable) {
if (useJsonSerializable) {
String jsonStr = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect);
this.addObjectToCache(redisKeyBuilder, jsonStr, searchCache);
} else {
this.addObjectToCache(redisKeyBuilder, object, searchCache);
}
public <T> void addSerializableObjectToCache(SearchCache searchCache, RedisKeyBuilder redisKeyBuilder, T object) {
String jsonStr = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect);
this.addObjectToCache(redisKeyBuilder, jsonStr, searchCache);
}
}
... ...
package com.yoho.search.cache.model;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.io.Serializable;
/**
... ... @@ -28,12 +24,6 @@ public class CacheObject implements Serializable {
this.value = object;
}
public CacheObject(JSONObject jsonObject) {
super();
this.type = "JSONObject";
this.value = JSON.toJSONString(jsonObject, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect);
}
public String getType() {
return type;
}
... ... @@ -50,21 +40,6 @@ public class CacheObject implements Serializable {
this.value = value;
}
public JSONObject toJSONObject() {
try {
if (value == null) {
return null;
}
if ("JSONObject".equals(type)) {
return JSON.parseObject(value.toString());
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public Object toObject() {
try {
if (value == null) {
... ...
... ... @@ -5,10 +5,6 @@ import com.yoho.search.base.utils.CharUtils;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.base.utils.RedisKeys;
import com.yoho.search.base.utils.SearchCollectionUtils;
import com.yoho.search.cache.beans.SearchCacheFactory;
import com.yoho.search.cache.beans.SearchCacheService;
import com.yoho.search.cache.log.SearchCacheMatchLogger;
import com.yoho.search.cache.model.SearchCache;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.common.SearchRequestParams;
import com.yoho.search.core.es.model.SearchParam;
... ... @@ -33,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;
... ... @@ -60,17 +55,6 @@ public class RecommendWordsService {
private SearchKeyWordHelper searchKeyWordService;
@Autowired
private ProductIndexBaseService productIndexBaseService;
@Autowired
protected SearchCacheService searchCacheService;
@Autowired
protected SearchCacheFactory searchCacheFactory;
private SearchCache searchCache;
@PostConstruct
public void init() {
searchCache = searchCacheFactory.getRecommendCache();
}
/**
* 根据query关键词和搜索结果获取搜索推荐词。 用于搜索结果数量太少或者无结果的时候给予用户的搜索建议。
... ... @@ -260,26 +244,16 @@ public class RecommendWordsService {
sortBuilders.add(SortBuilders.fieldSort(countField).order(SortOrder.DESC));
searchParam.setSortBuilders(sortBuilders);
// 4) 先从缓存中获取
final String indexName = ISearchConstants.INDEX_NAME_SUGGEST;
JSONObject suggestResult = searchCacheService.getJSONObjectFromCache(this.searchCache, indexName, searchParam);
if (suggestResult != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("recommendBySuggestIndex", paramMap);
return suggestResult;
}
// 5) 调用ES执行搜索
// 4) 调用ES执行搜索
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_SUGGEST, searchParam);
if (searchResult == null) {
return null;
}
// 6) 构建结果加入缓存
suggestResult = new JSONObject();
JSONObject suggestResult = new JSONObject();
List<String> resultTerms = searchResult.getResultList().stream().map(map -> (String) map.get("keyword")).collect(Collectors.toList());
suggestResult.put("terms_suggestion", resultTerms);
searchCacheService.addJSONObjectToCache(this.searchCache, indexName, searchParam, suggestResult);
logger.info("[func=recommendBySuggestIndex][srcQueryWord={}][keywordsToSearch={}][resultTerms={}][cost={}]", srcQueryWord, keywordsToSearch, resultTerms,
System.currentTimeMillis() - begin);
return suggestResult;
}
... ... @@ -388,11 +362,6 @@ public class RecommendWordsService {
// 缓存和列表的很难命中 所以单独自己调 而没有走ProductListServiceImpl的代码
final String indexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
JSONObject jsonObject = searchCacheService.getJSONObjectFromCache(this.searchCache, indexName, productIndexSearchParam);
if (jsonObject != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("aggKeywordsBySkns", queryWord);
return jsonObject.getString("aggKeyword");
}
SearchResult productIndexSearchResult = searchCommonService.doSearch(indexName, productIndexSearchParam);
if (productIndexSearchResult == null) {
... ... @@ -400,9 +369,6 @@ public class RecommendWordsService {
}
List<Map<String, Object>> productList = productIndexBaseService.buildProductReturnInfoList(productIndexSearchResult.getResultList());
String aggKeyword = aggKeywordsByProductList(productList);
jsonObject = new JSONObject();
jsonObject.put("aggKeyword", aggKeyword);
searchCacheService.addJSONObjectToCache(this.searchCache, indexName, productIndexSearchParam, jsonObject);
return aggKeyword;
}
... ... @@ -438,15 +404,8 @@ public class RecommendWordsService {
searchParam.setSize(1);
searchParam.setFiter(QueryBuilders.termQuery("status", 1));
// 3) 先从缓存中获取
final String indexName = ISearchConstants.INDEX_NAME_CONVERSION;
JSONObject suggestResult = searchCacheService.getJSONObjectFromCache(this.searchCache, indexName, searchParam);
if (suggestResult != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("getSuggestConversionDestBySource", queryWord);
return suggestResult.getString("dest");
}
// 4) 调用ES执行搜索
final String indexName = ISearchConstants.INDEX_NAME_CONVERSION;
SearchResult searchResult = searchCommonService.doSearch(indexName, searchParam);
if (searchResult == null) {
return null;
... ... @@ -461,10 +420,8 @@ public class RecommendWordsService {
}
// 6) 加入缓存
suggestResult = new JSONObject();
JSONObject suggestResult = new JSONObject();
suggestResult.put("dest", dest);
searchCacheService.addJSONObjectToCache(this.searchCache, indexName, searchParam, suggestResult);
logger.info("[func=getSuggestConversionDestBySource][query={}][cost={}]", queryWord, System.currentTimeMillis() - begin);
return dest;
}
... ...