Я новичок в мире алгоритмов вращения. Мне нужно улучшить уже существующий алгоритм резервного копирования, написанный на Java, который заботится о резервном копировании баз данных и их архивировании. Важным аспектом этого алгоритма является то, что он считывает файл INI, в котором вы можете указать, в какие дни недели пользователь хочет создавать резервные копии своих баз данных.
Например. вот так: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI
или ScheduledWeekDaysAct=TUE, FRI
Таким образом, алгоритм ротации должен учитывать, что резервные копии могут создаваться во все комбинации дней. Это означает, что я не могу легко использовать алгоритм дед-отец-сын, который я уже реализовал. Потому что то, что я закодировал, предполагает, что резервные копии создаются каждый день в году, и это несовместимо с кодом резервного копирования.
Для этой проблемы есть идея алгоритма, не слишком сложное ожидаемое поведение, которое заключается в следующем:
- Всегда следует сохранять первые 10 (десять) самых последних резервных копий.
- After the most recent ten is kept, the rest older should be thinned. Not piece by piece, but by datetime. The date of the 10th oldest backup is a designated reference date, to which the older backups will be compared upon a new backup happens. Older backups should be kept and thinned something like the following.
After the 10th oldest backup there should be kept:
- 3 or 4 backups which are the newest on 3-4 prior weeks,
- 11 ежемесячных резервных копий,
- Резервное копирование на 1 год.
Я не могу использовать системную дату и время, мне нужно анализировать имена файлов резервных копий. Но в конце концов, даты резервных копий предоставляются.
Мой подход: поскольку я не могу знать расписание, какое резервное копирование будет происходить в какой день, мне приходится работать с интервалами, периодами, полосами дат. Мне нужно определить относительный возраст резервных копий после 10-й резервной копии. Этот относительный возраст определяется как разница в днях между фактической контрольной датой (10-я старейшая дата резервного копирования) и датами резервного копирования до 10-го сохранения.
Я могу это сделать, я читаю имена файлов, анализирую дату из String
, получаю Date
объектов из этих проанализированных строк. Я могу поместить их в Map<Path, Date>
(позже мне также понадобится функция отсутствия дубликатов Set
, чтобы избавиться от одинаковых дат [может быть несколько баз данных с одинаковой датой, но разными именами]). Я всегда могу определить дату 10-го сохранения, чтобы получить эталонный объект Date
. Поэтому я всегда могу рассчитать относительный возраст резервной копии. Относительный возраст резервных копий уникален, и я могу сохранить относительный возраст с помощью Date
, из которого он был рассчитан, вот так TreeMap<Integer, Date>
.
Я полагаю, мне нужно работать с диапазонами относительных возрастов (keySet()
). Если я могу определить минимальный и максимальный относительный возраст в диапазоне относительного возраста, я могу отфильтровать Date
объектов, на которые ссылается относительный возраст. ( if relativeAge < 7
,if relativeAge >= 7 & relativeAge < 14
и т. д.) Но мне также нужно повернуть Dates
...
Я не могу обдумать это, любые идеи приветствуются. Спасибо!
Редактировать 1:
По сути проблема сводится к следующему:
У меня есть список целых чисел. (Список относительных возрастов): [1, 3, 5, 8, 10, 12, 15, 17, 19, 22, 24, 26...]
Мне нужно создать нижнюю и верхнюю границы, чтобы сформировать группы этих целых чисел. Целое число, относительный возраст может быть между 0 и 7 или 7 и 14, 14 и 21, 21 и 28, 28 и 56, 56 и 84 ... 336 и 364, и может быть больше 364. Мне нужно найти целые числа, которые попадают в эти диапазоны соответственно. После того, как я нашел эти группы целых чисел (группа может содержать 0, 1 или более целых чисел), я должен взять самый высокий/самый старший относительный возраст в определенном диапазоне, группу. Если диапазон выше 364, мне придется сохранить самое низкое сохранение, чтобы предотвратить накопление ежегодных сохранений. Я должен собрать эти самые высокие относительные возрасты в вышеуказанных диапазонах, и они образуют группу относительных возрастов.
Эти относительные возрасты недвусмысленно ссылаются на даты файлов резервных копий, поэтому теперь я буду знать, какая дата / файл в соответствии с ним должны быть сохранены в фактической ротации.
Я могу интерпретировать понятие максимального относительного возраста (maxRelAge) в данной ротации, то есть возраста самой старой резервной копии относительно фактической контрольной даты.
Мне не нужно проверять диапазоны целых чисел выше максимального относительного возраста. Через 1 год алгоритм заработает в полном объеме.
Но я до сих пор не знаю, как закодировать этот алгоритм на Java.