Hazelcast - исключение записи из IMap по истечении определенного периода времени, независимо от того, сколько раз оно обновляется - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть следующий вариант использования, где мне нужно удалить запись из IMap, независимо от того, сколько раз она обновляется. Мой ключ - это строка, а мое значение - объект Java.

Если, например, запись добавлена ​​12 мая, ее необходимо удалить через 14 дней, т.е. 26 мая, независимо от того, сколько раз она обновляется.

Hazelcast имеет в своей конфигурации тег под названием время жизни, в котором вы можете указать, сколько времени запись может оставаться на карте.

Итак, из документации Hazelcast,

"Максимальное время в секундах для каждой записи, чтобы остаться на карте. Если это не 0, записи, которые старше, чем это время и не обновлены в течение этого времени, автоматически удаляются. Допустимые значения - целые числа от 0 до Integer.MAX. ЗНАЧЕНИЕ. Значение по умолчанию - 0, что означает бесконечность. Если оно не равно 0, записи исключаются независимо от установленной политики исключения. "

Таким образом, с учетом вышеизложенного, если вы рассмотрите приведенный выше пример, запись, добавленная первоначально 12 мая, а затем обновленная 24 мая, будет удалена через 14 дней после 24 мая, а не 26 мая.

Следовательно, для решения вышеуказанной проблемы я использую следующий подход. Когда мне нужно обновить запись, я сначала получаю EntryView с карты, а затем использую его, получая время истечения. Затем получить текущее время и взять разницу времени истечения с текущим временем, а затем обновить значение, указав время жизни как разницу времени истечения и текущего времени.

    Employee employee= IMap.get("A12");
    employee.setDescr("loasfdeff");
    EntryView<String,Employee> entryView=iMap.getEntryView("A12");
    Long expirationTime=entryView.getExpirationTime();
    Long currentTime=System.currentTimeMillis();
    Long difference=expirationTime-currentTime;      
    iMap.set("A12",employee, difference, TimeUnit.MILLISECONDS);

Я проверил вышеуказанный подход, и он работает. Хотя я хотел бы изучить другие альтернативы, чтобы посмотреть, есть ли что-нибудь, что hazelcast предоставляет из коробки, чтобы помочь мне решить мой вариант использования.

Любая помощь очень ценится!

РЕДАКТИРОВАТЬ-

ВЫПУСК GITHUB- https://github.com/hazelcast/hazelcast/issues/13012

1 Ответ

0 голосов
/ 01 мая 2018

Вы правы в том, как работает TTL. Простое обновление записи - это то же самое, что и добавление новой записи, поэтому система не может интерпретировать намерение. Тем не менее, это было бы хорошим улучшением: добавление переключателя для сохранения даты истечения срока действия.

У меня есть пара альтернативных подходов:

1) Рассмотрите возможность добавления поля метки времени к объекту значения и установки его в текущее время на исходном объекте. Как только это произойдет, вы можете написать службу executor, которая будет запускаться через определенные промежутки времени и делать недействительными объекты на основе общего желаемого TTL. Вы также можете проиндексировать это поле, чтобы сделать его более производительным.

2) Вы можете написать собственную политику выселения, расширив класс MapCustomEvictionPolicy и применив ее к своей карте. Скорее всего, вам все равно потребуется добавить временную метку в значение (или ключ, если вы хотите сделать этот объект настраиваемым). После этого у вас будет чистый лист для того, как вы хотите, чтобы это работало.

Тем временем я создам запрос на улучшение продукта. Возможно, он появится в следующем выпуске, так как он не слишком сложен для добавления.

...