【问题标题】:JedisDataException: ERR WATCH inside MULTI is not allowedJedisDataException:不允许 MULTI 内的 ERR WATCH
【发布时间】:2019-11-17 04:52:58
【问题描述】:

我使用jedis来使用Redis数据库。该软件基于 AWS 服务,如 Redis、SQS、SMS 和带有 POD 的 Kubernetes 等。 实际上一切正常,但是一旦我遇到以下异常:“JedisDataException:不允许 MULTI 内的 ERR WATCH”,这发生在代码中可见的地方。我无法再向 Redis 发出任何请求(无论我想使用哪种密钥)。重新启动 POD 后,一切正常。 我无法再重现该错误。

你知道有什么问题吗? 我怀疑它与 aws-sqs 或 POD 的缩放和并发性有关。

事件顺序为:event --> aws:sns --> aws:sqs --> k8s:POD (java code) --> 给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;
}

【问题讨论】:

    标签: java amazon-web-services kubernetes redis jedis


    【解决方案1】:

    我猜,tx.hsetnx(key, value, json); 这一行抛出了一个异常,这使得该事务永远打开,随后的请求(对方法的新调用)开始像 watch 一样执行这些步骤,并且事务已经打开并在相同的连接可能会引发错误?。

    当您进行 pod 回收/重启时,意味着 pod 被破坏,持有连接的 pod 被关闭,最终,事务被关闭。 因此,您似乎没有收到此错误,但如果在运行 EXEC 命令之前发生异常,此问题可能会再次出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-22
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多