package com.jthink.skyeye.collector.service; import com.jthink.skyeye.data.jpa.domain.NameInfo; import com.jthink.skyeye.data.jpa.domain.ServiceInfo; import com.jthink.skyeye.data.jpa.repository.NameInfoRepository; import com.jthink.skyeye.base.constant.Constants; import com.jthink.skyeye.base.constant.NameInfoType; import com.jthink.skyeye.data.jpa.repository.ServiceInfoRepository; import org.apache.commons.lang.time.StopWatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * JThink@JThink * * @author JThink * @version 0.0.1 * @desc 缓存名称采集相关的数据 * @date 2016-11-22 09:23:19 */ @Service public class CacheService implements InitializingBean { private static Logger LOGGER = LoggerFactory.getLogger(CacheService.class); @Autowired private NameInfoRepository nameInfoRepository; @Autowired private ServiceInfoRepository serviceInfoRepository; @Autowired private StringRedisTemplate redisTemplate; private SetOperations<String, String> setOps; private static final String CONFIG_PREFIX = "jthink_monitor_collector"; private static final String API_NAME_PREFIX = "jthink_monitor_collector_api_name"; private static final String ACCOUNT_NAME_PREFIX = "jthink_monitor_collector_account_name"; private static final String THIRD_NAME_PREFIX = "jthink_monitor_collector_third_name"; private static final String SERVICE_INFO_PREFIX = "jthink_monitor_collector_service_info"; public static final String SERVICE_INFO_TYPE = "service"; private static final Map<String, String> mapping = new HashMap<String, String>() { { put(NameInfoType.API.symbol(), API_NAME_PREFIX); put(NameInfoType.ACCOUNT.symbol(), ACCOUNT_NAME_PREFIX); put(NameInfoType.THIRD.symbol(), THIRD_NAME_PREFIX); put(SERVICE_INFO_TYPE, SERVICE_INFO_PREFIX); } }; /** * 保存 * @param nameInfo */ public void save(NameInfo nameInfo) { this.nameInfoRepository.save(nameInfo); } /** * 保存 * @param serviceInfo */ public void save(ServiceInfo serviceInfo) { this.serviceInfoRepository.save(serviceInfo); } /** * 根据采集的类型和值存入redis * @param type * @param value * @return */ public void add(String type, String value) { this.setOps.add(mapping.get(type), value); } /** * 根据采集的类型和值判断是否存在 * @param type * @param value * @return */ public boolean isExists(String type, String value) { return this.setOps.isMember(mapping.get(type), value); } /** * 将数据库中的配置表进行缓存 */ private void loadCache() { StopWatch sw = new StopWatch(); sw.start(); LOGGER.info("start load config to cache"); Iterable<NameInfo> nameInfos = this.nameInfoRepository.findAll(); for (Iterator<NameInfo> it = nameInfos.iterator(); it.hasNext();) { NameInfo nameInfo = it.next(); this.setOps.add(mapping.get(nameInfo.getNameInfoPK().getType()), nameInfo.getNameInfoPK().getName()); } Iterable<ServiceInfo> serviceInfos = this.serviceInfoRepository.findAll(); for (Iterator<ServiceInfo> it = serviceInfos.iterator(); it.hasNext();) { ServiceInfo serviceInfo = it.next(); this.setOps.add(SERVICE_INFO_PREFIX, serviceInfo.getSid()); } sw.stop(); LOGGER.info("load config to cache end, cost {} ms", sw.getTime()); } /** * 将redis中的配置信息清除 */ private void clearCache() { StopWatch sw = new StopWatch(); sw.start(); LOGGER.info("start clear config cache"); Set<String> keys = this.redisTemplate.keys(CONFIG_PREFIX + Constants.XING_HAO); this.redisTemplate.delete(keys); sw.stop(); LOGGER.info("clear config cache end, cost {} ms", sw.getTime()); } /** * 缓存数据初始化 */ public void load() { this.clearCache(); this.loadCache(); } @Override public void afterPropertiesSet() throws Exception { this.setOps = this.redisTemplate.opsForSet(); this.load(); } }