java 使用Lettuce配置在springboot中启用Redis集群模式时出现CROSSSLOT Keys错误

wkyowqbh  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(158)

我们刚刚从redis单机迁移到集群,我们遇到了以下异常:RedisSystemException:执行错误;嵌套异常为io. lett.core.RedisCommandExecutionException:请求中的CROSSSLOT密钥不会哈希到同一个插槽。在进一步深入研究时,我发现当请求中的键在redisTemplate.opsForZSet().intersectAndStore / redisTemplate.opsForZSet().differenceAndStore和类似的联合交叉操作期间没有散列到同一个插槽时,这个问题就会出现。
我遇到了一个叫做主题标签的概念,但是我还没有找到一种方法来通过我的代码来解决它

@LogMethodCall
  public String getValueByKey(String key) {
    if (BooleanUtils.isTrue(keyExists(key))) {
      return redisTemplate.opsForValue().get(key+"{someconstantstring}");
    }
    return null;
  }

  @LogMethodCall
  public void save(String key, String value) {
    if (StringUtils.isNotEmpty(key)) {
      redisTemplate.opsForValue().set(key+"{someconstantstring}", value);
    }
  }

  @LogMethodCall
  public void saveWithExpiryInMinutes(String key, String value, long expiryTime) {
    if (StringUtils.isNotEmpty(key)) {
      redisTemplate.opsForValue().set(key+"someconstantstring", value, expiryTime, TimeUnit.MINUTES);
    }
  }

  @LogMethodCall
  public void saveWithExpiryInSeconds(String key, String value, long expiryTime) {
    if (StringUtils.isNotEmpty(key)) {
      redisTemplate.opsForValue().set(key+"{someconstantstring}", value, expiryTime, TimeUnit.SECONDS);
    }
  }

字符串
我是不是理解错了?任何可能有效的代码片段示例输入都可能帮助我完成这一过程?

tpxzln5u

tpxzln5u1#

我试图为一个redis键传递不同的键:value。问题是每次传递相同的密钥,而不是冒险更改它。例如

redisTemplate.opsForValue().set("{someconstantstring}", value;

字符串
这篇博客提供了一个很好的洞察力:https://hackernoon.com/resolving-the-crossslot-keys-error-with-redis-cluster-mode-enabled

相关问题