如何在redis缓存中将java hashmap层次结构转换为等价的层次结构?

icnyk63a  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(439)

我有以下代表作业运行的作业类。我在作业类中有一个开始和结束时间的列表,因为同一个作业可以重新运行。

public class Job {

      private final List<Timestamp> jobStartTimes = new SortedList<>();
      private final List<Timestamp> jobEndTimes = new SortedList<>();
      private String jobName;
      private String jobKey;
      private String host;
      ....
      ....
}

我有这个Map,可以查询给定jobkey的作业。

public class JobMap {

         /**
         * Here value of 'String' key is jobKey
         */
         private final Map<String, Job> jobCache;
}

我还创建了以下hashmaps层次结构,用于在map中存储(starttime,jobkey)和(endtime,jobkey)条目,以便更快地检索作业记录。这是必需的,因为我的查询是基于时间戳的,例如:返回在x和y时间戳之间运行的所有作业。

public class YearCache<T> {

        /**
         * Here value of 'Integer' key is month number (0, 11)
         */
        private final Map<Integer, MonthCache> monthCache;
}

public class MonthCache {

        /**
         * Here value of 'Integer' key is week number in a month(0, 4)
         */
        private final Map<Integer, WeekCache> weekCache;
}

public class WeekCache {

        /**
         * Here value of 'Integer' key is day number in a week (0, 6)
         */
        private final Map<Integer, DayCache> dayCache;
}

private class DayCache
{
        /**
         * Here value of 'Integer' key is hour value in a day (0, 23)
         * T is of type String representing jobKey
         */
         private final NavigableMap<Integer, NavigableMap<Timestamp, Set<T>>> hourCache;
}

我想摆脱这个java hashmaps,转到redis缓存。如何在redis缓存中对这个层次结构建模?

pexxcrt2

pexxcrt21#

这是必需的,因为我的查询是基于时间戳的,例如:返回在x和y时间戳之间运行的所有作业。
看看redis时间序列模式中的排序集时间序列模式。详情可在这里找到。你可能需要对这个例子稍加调整以适应你的需要。文件摘录:

+---------------+-------------+
| Timestamp     | Temperature |
+---------------+-------------+
| 1511533205001 | 21          |
+---------------+-------------+
| 1511533206001 | 22          |
+---------------+-------------+

您可以这样查询:

> ZADD temperature 1511533205001 21
(integer) 1
> ZADD temperature 1511533206001 22
(integer) 1
> ZRANGEBYSCORE temperature -inf +inf WITHSCORES
1) "22"
2) "1511533206001"
3) "21"
4) "1511533207001"

这是一个简单的例子。该链接讨论了此方法的扩展,以处理特定的拐角情况。
为了你的案子,考虑到你 jobStartTime 以及 jobEndTime ,则可能需要使用单独的集合 jobStarts 以及 jobEnds 由作业开始/结束的时间戳键入。然后:
x 表示起点和终点 y 表示作业结束
查询之后启动的所有作业 xjobStarts 设置
查询之前完成的所有作业 y 但开始于 xjobsEnds 设置
步骤1和步骤2的结果中的重复值将生成在之后开始的作业 x 结束于 y 在代码中:

public class Job {

      private final List<Timestamp> jobStartTimes = new SortedList<>();
      private final List<Timestamp> jobEndTimes = new SortedList<>();
      ....
      private String jobKey;
      ....
}

您正在将所有运行存储为作业的一部分。最好将作业与作业分开运行,以便作业详细信息可以单独缓存在名为 jobs . 然后是集合的值 jobStarts 以及 jobEnds 可以是jobkey,您可以使用它从 jobs 分别存储作业详细信息的设置。

相关问题