У меня есть некоторые проблемы при использовании Spring Data Redis для создания распределенной блокировки. Для этого используется метод putIfAbsent из CacheManager.
С точки зрения высокого уровня операция выглядит примерно так:
if (manager.putIfAbsent(parameters) == null) {
executeOperation();
}
Из реализации putIfAbsent кажется, что операция setNXиз базового драйвера Jedis.
Код реализации Spring выглядит примерно так:
if (!connection.setNX(keyBytes, value)) {
return connection.get(keyBytes);
}
maintainKnownKeys(element, connection);
processKeyExpiration(element, connection);
setNX соединения - это просто делегирование действительной клиентской операции. В реализации этого метода есть что-то вроде:
JedisConverters.toBoolean(jedis.setnx(key, value));
Поэтому я столкнулся с двумя отдельными проблемами:
Мой executeOperation () былодновременно выполняется двумя отдельными процессами. (Лишь несколько случаев этой проблемы).
Я столкнулся с ситуацией, когда ключ оставался и срок его действия не истек. Это означает, что код processKeyExpiration (element, connection) не был выполнен. Это означает, что setNx, выполненный как ключ, не был добавлен и возвращен до этого оператора, но фактически ключ был добавлен.
В большинстве случаев все работает нормально. Ключевой сериализатор: StringRedisSerializer
.
Я использую: spring-data-redis 1.8.23.RELEASE jedis 2.9.3
Могут ли быть некоторые проблемы с окружающей средой, которые неправильно обрабатываютсяДжедай, или как то так? Кто-нибудь достиг такого? Можно ли попробовать какое-нибудь исправление, обновление библиотеки?