JedisDataException: ERR WATCH внутри MULTI не допускается - PullRequest
1 голос
/ 07 июля 2019

Я использую jedis для использования базы данных Redis.Программное обеспечение основано на сервисах AWS, таких как Redis, SQS, SMS и Kubernetes с POD и т. Д. На самом деле все работает нормально, но однажды у меня появилось следующее исключение: «JedisDataException: ERR WATCH внутри MULTI не разрешен», что произошло на месте как есть.видно в коде.Я не мог больше отправлять запросы в Redis (независимо от того, какой ключ я хотел использовать).После перезапуска POD все работает отлично.Я не могу больше воспроизвести ошибку.

У вас есть идеи, в чем проблема?Я уверен, что это как-то связано с aws-sqs или масштабированием POD и параллелизмом.

последовательность событий: событие -> aws: sns -> aws: sqs -> k8s: POD (код Java) -> добавить значение к aws: redis

Спасибо.

public boolean add(key, value) {
   jedis.watch(key);

   Transaction tx = jedis.multi();

   tx.hsetnx(key, value, json);

   if (tx.exec().size() == 0) {

      LOGGER.warn("nothing executed...");
   } else {
      LOGGER.debug("add bike executed...");
   }

   jedis.resetState();
   return true;
}

1 Ответ

0 голосов
/ 09 июля 2019

Во-первых, Redis не позволяет WATCH в блоке MULTI .

Во-вторых, вы можете использовать Jedis в многопоточной среде.Где, после jedis.multi() и до tx.exec(), jedis.watch(key) вызывается с тем же объектом джедаев!

...