package com.sohu.cache.redis.impl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sohu.cache.dao.InstanceConfigDao; import com.sohu.cache.entity.InstanceConfig; import com.sohu.cache.protocol.MachineProtocol; import com.sohu.cache.redis.RedisConfigTemplateService; import com.sohu.cache.redis.enums.RedisClusterConfigEnum; import com.sohu.cache.redis.enums.RedisConfigEnum; import com.sohu.cache.redis.enums.RedisSentinelConfigEnum; import com.sohu.cache.util.ConstUtils; /** * redis配置模板服务 * * @author leifu * @Date 2016年6月23日 * @Time 下午2:08:03 */ public class RedisConfigTemplateServiceImpl implements RedisConfigTemplateService { private Logger logger = LoggerFactory.getLogger(RedisConfigTemplateServiceImpl.class); private final static String SPECIAL_EMPTY_STR = "\"\""; private InstanceConfigDao instanceConfigDao; @Override public List<InstanceConfig> getAllInstanceConfig() { try { return instanceConfigDao.getAllInstanceConfig(); } catch (Exception e) { logger.error(e.getMessage(), e); return Collections.emptyList(); } } @Override public List<InstanceConfig> getByType(int type) { try { return instanceConfigDao.getByType(type); } catch (Exception e) { logger.error(e.getMessage(), e); return Collections.emptyList(); } } @Override public int saveOrUpdate(InstanceConfig instanceConfig) { return instanceConfigDao.saveOrUpdate(instanceConfig); } @Override public InstanceConfig getById(long id) { try { return instanceConfigDao.getById(id); } catch (Exception e) { logger.error(e.getMessage(), e); return null; } } @Override public InstanceConfig getByConfigKeyAndType(String configKey, int type) { try { return instanceConfigDao.getByConfigKeyAndType(configKey, type); } catch (Exception e) { logger.error(e.getMessage(), e); return null; } } @Override public int remove(long id) { return instanceConfigDao.remove(id); } @Override public int updateStatus(long id, int status) { return instanceConfigDao.updateStatus(id, status); } @Override public List<String> handleCommonConfig(int port, int maxMemory) { List<InstanceConfig> instanceConfigList = getByType(ConstUtils.CACHE_REDIS_STANDALONE); if (CollectionUtils.isEmpty(instanceConfigList)) { return Collections.emptyList(); } List<String> configs = new ArrayList<String>(); for (InstanceConfig instanceConfig : instanceConfigList) { // 无效配置过滤 if (!instanceConfig.isEffective()) { continue; } String configKey = instanceConfig.getConfigKey(); String configValue = instanceConfig.getConfigValue(); if (StringUtils.isBlank(configValue)) { configValue = SPECIAL_EMPTY_STR; } if (RedisConfigEnum.MAXMEMORY.getKey().equals(configKey)) { configValue = String.format(configValue, maxMemory); } else if (RedisConfigEnum.DBFILENAME.getKey().equals(configKey) || RedisConfigEnum.APPENDFILENAME.getKey().equals(configKey) || RedisConfigEnum.PORT.getKey().equals(configKey)) { configValue = String.format(configValue, port); } else if (RedisConfigEnum.DIR.getKey().equals(configKey)) { configValue = MachineProtocol.DATA_DIR; } else if (RedisConfigEnum.AUTO_AOF_REWRITE_PERCENTAGE.getKey().equals(configKey)) { //随机比例 auto-aof-rewrite-percentage int percent = 69 + new Random().nextInt(30); configValue = String.format(configValue, percent); } configs.add(combineConfigKeyValue(configKey, configValue)); } return configs; } @Override public List<String> handleSentinelConfig(String masterName, String host, int port, int sentinelPort) { List<InstanceConfig> instanceConfigList = instanceConfigDao.getByType(ConstUtils.CACHE_REDIS_SENTINEL); if (CollectionUtils.isEmpty(instanceConfigList)) { return Collections.emptyList(); } List<String> configs = new ArrayList<String>(); for (InstanceConfig instanceConfig : instanceConfigList) { if (!instanceConfig.isEffective()) { continue; } String configKey = instanceConfig.getConfigKey(); String configValue = instanceConfig.getConfigValue(); if (StringUtils.isBlank(configValue)) { configValue = SPECIAL_EMPTY_STR; } if (RedisSentinelConfigEnum.PORT.getKey().equals(configKey)) { configValue = String.format(configValue, sentinelPort); } else if(RedisSentinelConfigEnum.MONITOR.getKey().equals(configKey)) { configValue = String.format(configValue, masterName, host, port); } else if(RedisSentinelConfigEnum.DOWN_AFTER_MILLISECONDS.getKey().equals(configKey) || RedisSentinelConfigEnum.FAILOVER_TIMEOUT.getKey().equals(configKey) || RedisSentinelConfigEnum.PARALLEL_SYNCS.getKey().equals(configKey)) { configValue = String.format(configValue, masterName); } else if (RedisConfigEnum.DIR.getKey().equals(configKey)) { configValue = MachineProtocol.DATA_DIR; } configs.add(combineConfigKeyValue(configKey, configValue)); } return configs; } @Override public List<String> handleClusterConfig(int port) { List<InstanceConfig> instanceConfigList = getByType(ConstUtils.CACHE_TYPE_REDIS_CLUSTER); if (CollectionUtils.isEmpty(instanceConfigList)) { return Collections.emptyList(); } List<String> configs = new ArrayList<String>(); for (InstanceConfig instanceConfig : instanceConfigList) { if (!instanceConfig.isEffective()) { continue; } String configKey = instanceConfig.getConfigKey(); String configValue = instanceConfig.getConfigValue(); if (StringUtils.isBlank(configValue)) { configValue = SPECIAL_EMPTY_STR; } if (RedisClusterConfigEnum.CLUSTER_CONFIG_FILE.getKey().equals(configKey)) { configValue = String.format(configValue, port); } configs.add(combineConfigKeyValue(configKey, configValue)); } return configs; } @Override public List<String> handleCommonDefaultConfig(int port, int maxMemory) { List<String> configs = new ArrayList<String>(); for (RedisConfigEnum config : RedisConfigEnum.values()) { if (RedisConfigEnum.MAXMEMORY.equals(config)) { configs.add(config.getKey() + " " + String.format(config.getValue(), maxMemory)); } else if (RedisConfigEnum.DBFILENAME.equals(config) || RedisConfigEnum.APPENDFILENAME.equals(config) || RedisConfigEnum.PORT.equals(config)) { configs.add(config.getKey() + " " + String.format(config.getValue(), port)); } else if (RedisConfigEnum.DIR.equals(config)) { configs.add(config.getKey() + " " + MachineProtocol.DATA_DIR); } else if (RedisConfigEnum.AUTO_AOF_REWRITE_PERCENTAGE.equals(config)) { //随机比例 auto-aof-rewrite-percentage int percent = 69 + new Random().nextInt(30); configs.add(config.getKey() + " " + String.format(RedisConfigEnum.AUTO_AOF_REWRITE_PERCENTAGE.getValue(), percent)); } else { configs.add(config.getKey() + " " + config.getValue()); } } return configs; } @Override public List<String> handleSentinelDefaultConfig(String masterName, String host, int port, int sentinelPort) { List<String> configs = new ArrayList<String>(); configs.add(RedisSentinelConfigEnum.PORT.getKey() + " " + String.format(RedisSentinelConfigEnum.PORT.getValue(), sentinelPort)); configs.add(RedisSentinelConfigEnum.DIR.getKey() + " " + RedisSentinelConfigEnum.DIR.getValue()); configs.add(RedisSentinelConfigEnum.MONITOR.getKey() + " " + String.format(RedisSentinelConfigEnum.MONITOR.getValue(), masterName, host, port, 1)); configs.add(RedisSentinelConfigEnum.DOWN_AFTER_MILLISECONDS.getKey() + " " + String .format(RedisSentinelConfigEnum.DOWN_AFTER_MILLISECONDS.getValue(), masterName)); configs.add(RedisSentinelConfigEnum.FAILOVER_TIMEOUT.getKey() + " " + String .format(RedisSentinelConfigEnum.FAILOVER_TIMEOUT.getValue(), masterName)); configs.add(RedisSentinelConfigEnum.PARALLEL_SYNCS.getKey() + " " + String .format(RedisSentinelConfigEnum.PARALLEL_SYNCS.getValue(), masterName)); return configs; } @Override public List<String> handleClusterDefaultConfig(int port) { List<String> configs = new ArrayList<String>(); for (RedisClusterConfigEnum config : RedisClusterConfigEnum.values()) { if (config.equals(RedisClusterConfigEnum.CLUSTER_CONFIG_FILE)) { configs.add(RedisClusterConfigEnum.CLUSTER_CONFIG_FILE.getKey() + " " + String.format(RedisClusterConfigEnum.CLUSTER_CONFIG_FILE.getValue(), port)); } else { configs.add(config.getKey() + " " + config.getValue()); } } return configs; } /** * 组合 * @param configKey * @param configValue * @return */ private String combineConfigKeyValue(String configKey, String configValue) { return configKey + ConstUtils.SPACE + configValue; } public void setInstanceConfigDao(InstanceConfigDao instanceConfigDao) { this.instanceConfigDao = instanceConfigDao; } }