Как преобразовать Java Hashmap Hierarchy в его эквивалент в Redis Cache? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть следующий класс 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;
}

Я также создал следующую иерархию хэш-карт для хранения (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 Cache?

1 Ответ

1 голос
/ 15 апреля 2020

Это необходимо, потому что мои запросы основаны на отметке времени, например: возвращаются все задания, которые выполнялись между отметками времени x и y.

Взгляните на Sorted Set Time Series Шаблон в шаблонах временных рядов Redis. Подробности можно найти здесь . Возможно, вам придется немного подправить пример, чтобы удовлетворить ваши потребности. Выдержка из do c:

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

Это простой пример. В ссылке обсуждается расширение этого подхода для обработки конкретного c углового случая.

В вашем случае, учитывая, что у вас есть jobStartTime и jobEndTime, вам, возможно, придется использовать отдельные наборы для jobStarts и jobEnds, заданные меткой времени, в которую задание было запущено / завершено. Тогда:

Пусть x обозначает начало, а y обозначает конец задания

  1. Запрашивает все задания, которые были запущены после x из jobStarts set
  2. Запрос всех заданий, выполненных до y, но запущенных после x из jobsEnds set
  3. Повторные значения по результатам шагов 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, который отдельно хранит сведения о задании.

...