java - 如何将 Java Hashmap Hierarchy 转换为 Redis Cache 中的等价物?
问题描述
我有以下代表作业运行的作业类。我在 Job 类中有一个开始和结束时间的列表,因为可以重新运行相同的 Job。
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;
....
....
}
我有这张地图用于查询给定作业键的作业。
public class JobMap {
/**
* Here value of 'String' key is jobKey
*/
private final Map<String, Job> jobCache;
}
我还创建了以下哈希映射层次结构,用于在 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 哈希图并转移到 Redis 缓存。如何在 Redis 缓存中建模此层次结构?
解决方案
这是必需的,因为我的查询是基于时间戳的,例如:返回在 x 和 y 时间戳之间运行的所有作业。
看看Redis Time Series Patterns 中的Sorted Set Time Series Pattern。详细信息可以在这里找到。您可能需要稍微调整示例以满足您的需要。文档摘录:
+---------------+-------------+
| 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
and jobEndTime
,您可能必须使用单独的集合来获取作业开始/结束的时间戳jobStarts
并jobEnds
以该时间戳为键。然后:
让x
表示作业的开始和y
结束
x
查询从jobStarts
set之后启动的所有job- 从集合中查询之前完成
y
但之后开始的所有作业x
jobsEnds
- 第 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
和可以是jobKey,您可以使用它从单独存储作业详细信息jobEnds
的集合中查找详细信息。jobs
推荐阅读
- c# - DataGridView 尝试将我的 SQLIte DateTimes 转换为 Image
- reactjs - 在redux store redux中清除搜索过滤器功能后如何返回原始状态
- c++ - 遍历unordered_map cpp的问题
- go - 为什么 Go 浮点数不能溢出而整数可以?
- ios - 为什么在IOS图像蒙版中蒙版图像像素RGB值显示原始图像RGB值?
- azure-application-insights - 什么 SSL 版本用于将数据从桌面应用程序记录到 Application Insights?
- java - 如何在 JAVA 中下载后获取 .zip 文件的动态名称
- html - 用画布创建图案
- html - 如何检查哪个 span 标签当前处于活动状态
- progressive-web-apps - 是否可以查看是否从 APP Store 与移动浏览安装了 PWA?