package com.sohu.test.redis;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sohu.cache.constant.InstanceStatusEnum;
import com.sohu.cache.dao.InstanceDao;
import com.sohu.cache.entity.InstanceInfo;
import com.sohu.cache.redis.RedisCenter;
import com.sohu.cache.util.TypeUtil;
import com.sohu.test.BaseTest;
import redis.clients.jedis.Jedis;
/**
* redis重要数据处理(请注意BaseTest是local环境)
*
* @author leifu
* @Date 2015年3月4日
* @Time 上午11:04:04
*/
public class RedisImportantDataDeal extends BaseTest {
private final static Logger logger = LoggerFactory.getLogger(RedisImportantDataDeal.class);
@Resource(name = "instanceDao")
private InstanceDao instanceDao;
@Resource(name = "redisCenter")
private RedisCenter redisCenter;
@Test
public void clearAllAppData() {
// /////////////一定要谨慎处理/////////////////
// /////////////一定要谨慎处理/////////////////
// /////////////一定要谨慎处理/////////////////
long appId = 000L;
// /////////////一定要谨慎处理///////////////
// /////////////一定要谨慎处理/////////////////
// /////////////一定要谨慎处理/////////////////
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
logger.warn("确认要清除appId:" + appId + "的所有内存数据(输入y代表确认):");
String confirm = null;
try {
confirm = br.readLine();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (!"y".equals(confirm)) {
return;
}
List<InstanceInfo> instanceList = instanceDao.getInstListByAppId(appId);
if (CollectionUtils.isEmpty(instanceList)) {
logger.error("appId: {}, 可能输入错误,不存在实例列表");
}
for (InstanceInfo instance : instanceList) {
if (instance.getStatus() != InstanceStatusEnum.GOOD_STATUS.getStatus()) {
continue;
}
String host = instance.getIp();
int port = instance.getPort();
// master + 非sentinel节点
Boolean isMater = redisCenter.isMaster(appId, host, port);
if (isMater != null && isMater.equals(true) && !TypeUtil.isRedisSentinel(instance.getType())) {
Jedis jedis = new Jedis(host, port, 30000);
try {
logger.info("{}:{} 开始清理内存", host, port);
long start = System.currentTimeMillis();
jedis.flushAll();
logger.info("{}:{} 清理完成, 耗时:{} ms", host, port, (System.currentTimeMillis() - start));
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
jedis.close();
}
}
}
}
}