Redis时间分片函数

/**
     * 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);
    }

posted @ 2021-06-30 09:27  大道至简、  阅读(116)  评论(0)    收藏  举报