如何将Java Hashmap层次结构转换为Redis缓存中的等效结构?

问题描述 投票:-1回答:1

我有以下Job类,表示作业的运行。我在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 Cache。如何在Redis缓存中对此层次结构建模?

java redis memcached
1个回答
0
投票

这是必需的,因为我的查询基于时间戳,例如:返回在x和y时间戳之间运行的所有作业。

看一下Redis时间序列模式中的排序时间序列模式] >>。可以找到详细信息here。您可能需要对示例进行一些微调以适合您的需要。摘录自文档:

+---------------+-------------+
| 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"

这是一个简单的示例。该链接讨论了此方法的扩展,以处理特定的极端情况。

对于您的情况,假设您有jobStartTimejobEndTime,则可能必须对以开始/结束作业的时间戳为键的jobStartsjobEnds使用单独的集。然后:

x代表工作的开始,y代表工作的结束

  1. x集中查询在jobStarts之后开始的所有作业
  2. y集中查询在x之前完成但在jobsEnds之后开始的所有作业
  3. 来自步骤1和2的结果的重复值产生在x之后开始并在y之前结束的作业
  4. 在您的代码中:

public class Job {

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

您将所有跑步存储为工作的一部分。最好将作业运行与作业分开,以便可以将作业详细信息分别缓存在名为jobs的集合中。然后,集jobStartsjobEnds的值可以是jobKey,您可以使用它们从jobs集中查找详细信息,该集单独存储作业详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.