/**
* redis时间分片函数
* @param firstLevelKey 一级key
* @param numberOfSharding 二级key个数(分区数) 12
* @param secondAliveTime 二级key存活时间
* @param shardingTime 分片时间 (分钟) * numberOfPartitions(二级key个数(分区数)) 约等于 回溯时间
* @return
*/
public void redisTimeSlicing(String firstLevelKey, String secondLevelKey, int numberOfSharding, int secondAliveTime, int shardingTime){
//当前时间
Date dateStart = new Date();
//主键的存活时间
int aliveTime = numberOfSharding * shardingTime * 60000;
//判断1级key是否存在,不存在则创建,并设置存活时间 aliveTime
if (StringUtils.isEmpty(jedisCluster.get(firstLevelKey))){
Date dateEnd = new Date(dateStart .getTime() + 60000 * shardingTime);
//将二级key存放到一级key的value中
String secondaryKey = secondLevelKey + dateStart.getTime() + "-" + dateEnd.getTime();
jedisCluster.lpush(firstLevelKey,secondaryKey);
jedisCluster.expire(firstLevelKey,aliveTime);
jedisCluster.set(secondaryKey,"" + 1);
jedisCluster.expire(secondaryKey,secondAliveTime * (numberOfSharding + 1));
return ;
}
//执行回调函数
callback(firstLevelKey, secondLevelKey, numberOfSharding, dateStart, shardingTime, secondAliveTime, aliveTime);
//获取指定分片信息,多余的分片不在监控,自动过期
if (jedisCluster.llen(firstLevelKey) > numberOfSharding + 1){
jedisCluster.ltrim(firstLevelKey,0, numberOfSharding );
}
}
/**
* 回调函数
* @param firstLevelKey
* @param secondLevelKey
* @param numberOfSharding
* @param dateStart
* @param shardingTime
* @param secondAliveTime
* @param aliveTime
*/
private void callback(String firstLevelKey, String secondLevelKey, int numberOfSharding, Date dateStart, int shardingTime, int secondAliveTime, int aliveTime){
//获取一级key已存在,取其下的0号位二级key
String secondaryKey = jedisCluster.get(jedisCluster.lindex(firstLevelKey, 0));
//二级key内容
String[] split = secondaryKey.split("-");
//如果分区结束时间大于当前时间
if (Long.parseLong(split[1]) > dateStart.getTime()){
//开始更新二级key value
String s = jedisCluster.get(secondaryKey);
jedisCluster.set(secondaryKey,(Integer.parseInt(s)+1) + "");
jedisCluster.expire(secondaryKey,secondAliveTime * (numberOfSharding + 1));
return;
}
//创建新的
Date dateEnd = new Date(Long.parseLong(split[1]) + 60000 * shardingTime);
//将二级key存放到一级key的value中
secondaryKey = secondLevelKey + split[1] + "-" + dateEnd.getTime();
jedisCluster.lpush(firstLevelKey,secondaryKey);
jedisCluster.expire(firstLevelKey, aliveTime);
jedisCluster.set(secondaryKey,"" + 0);
jedisCluster.expire(secondaryKey,secondAliveTime * (numberOfSharding + 1));
callback(firstLevelKey, secondLevelKey, numberOfSharding, dateStart, shardingTime, secondAliveTime, aliveTime);
}