我有以下代表作业运行的作业类。我在作业类中有一个开始和结束时间的列表,因为同一个作业可以重新运行。
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缓存中对这个层次结构建模?
1条答案
按热度按时间pexxcrt21#
这是必需的,因为我的查询是基于时间戳的,例如:返回在x和y时间戳之间运行的所有作业。
看看redis时间序列模式中的排序集时间序列模式。详情可在这里找到。你可能需要对这个例子稍加调整以适应你的需要。文件摘录:
您可以这样查询:
这是一个简单的例子。该链接讨论了此方法的扩展,以处理特定的拐角情况。
为了你的案子,考虑到你
jobStartTime
以及jobEndTime
,则可能需要使用单独的集合jobStarts
以及jobEnds
由作业开始/结束的时间戳键入。然后:让
x
表示起点和终点y
表示作业结束查询之后启动的所有作业
x
从jobStarts
设置查询之前完成的所有作业
y
但开始于x
从jobsEnds
设置步骤1和步骤2的结果中的重复值将生成在之后开始的作业
x
结束于y
在代码中:您正在将所有运行存储为作业的一部分。最好将作业与作业分开运行,以便作业详细信息可以单独缓存在名为
jobs
. 然后是集合的值jobStarts
以及jobEnds
可以是jobkey,您可以使用它从jobs
分别存储作业详细信息的设置。