CROSSSLOT Keys in request don‘t hash to the same slot. 问题处理

一、问题描述

Redis是我们在项目开发中常用的缓存中间件,Redis Cluster是Redis的分布式实现,可以帮我们提高架构是稳定性,可用性。在一次项目开发过程中,使用Redis进行两个Key进行比较,发生下面异常:

org.springframework.dao.InvalidDataAccessApiUsageException: CROSSSLOT Keys in request don't hash to the same slot. channel: nested exception is org.redisson.client.RedisException: CROSSSLOT Keys in request don't hash to the same slot. channel: [id: 0xd8e0d004, L:/10.186.72.183:49438 - R:10.150.25.24/10.150.25.24:6001] command: (SDIFF), params: [[111, 101, 115, 45, 112, 111, 111, 108, 45, 100, ...], [111, 101, 115, 45, 112, 111, 111, 108, 45, 100, ...]]
        at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:48)
        at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:35)
        at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44)
        at org.redisson.spring.data.connection.RedissonConnection.transform(RedissonConnection.java:234)
        at org.redisson.spring.data.connection.RedissonConnection.syncFuture(RedissonConnection.java:229)
二、解决方案

将Redis的Key中固定的值用{}包括起来。
举例:key1=order:1,key2=order:2
我们将order用{}括起来:key1={order}:1,key2={order}:2
这样问题就可以解决了。

三、问题分析(知其然,知其所以然)

报错日志的意思是:请求的Key键没有散列到同一个槽位中。
Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个。
每个Key都会经过CRC16计算散列到固定的槽位中,对于多个键,仅当它们都共享相同的连接插槽时才执行(源码中的描述)。

在这里插入图片描述
Redis集群规范中说到:
在这里插入图片描述
Jedis源码中的体现:

 public static int getSlot(byte[] key) {
    if (key == null) {
      throw new JedisClusterOperationException("Slot calculation of null is impossible");
    }

    int s = -1;
    int e = -1;
    boolean sFound = false;
    for (int i = 0; i < key.length; i++) {
      if (key[i] == '{' && !sFound) {
        s = i;
        sFound = true;
      }
      if (key[i] == '}' && sFound) {
        e = i;
        break;
      }
    }
    if (s > -1 && e > -1 && e != s + 1) {
      return getCRC16(key, s + 1, e) & (16384 - 1);
    }
    return getCRC16(key) & (16384 - 1);
  }

Redisson源码中的体现:
有点小问题:如果只拼前缀{ ,如“{order:1”,则会报错 java.lang.IllegalArgumentException: 1 > -1

  public int calcSlot(byte[] key) {
        if (key == null) {
            return 0;
        }

        int start = indexOf(key, (byte) '{');
        if (start != -1) {
            int end = indexOf(key, (byte) '}');
            key = Arrays.copyOfRange(key, start+1, end);
        }
        
        int result = CRC16.crc16(key) % MAX_SLOT;
        return result;
    }
当使用vue-cli(脚手架)创建项目后,并用npm run serve运行项目过程中,出现&quot;: Multiple assets emit different content to the same filename index.html&quot;的报错。这个错误是由于多个资源文件尝试向同一个文件名index.html中输出不同的内容导致的。 解决这个问题的方法是在webpack配置文件中,通过设置output的filename选项来避免冲突。你可以将filename设置为一个带有唯一标识的文件名,比如在文件名中添加hash值。这样每次构建项目时,都会生成一个不同的文件名,避免了冲突。 另外,这个错误也有可能是因为引入的静态文件路径不正确导致的。你可以检查一下引入静态文件的路径是否正确,确保资源被正确引入到项目中。 综上所述,解决&quot;Multiple assets emit different content to the same filename index.html&quot;的报错,你可以通过调整webpack配置文件中的output选项的filename属性,添加唯一标识来避免冲突。同时也要确保引入的静态文件路径正确无误。<span class=&quot;em&quot;>1</span><span class=&quot;em&quot;>2</span><span class=&quot;em&quot;>3</span> #### 引用[.reference_title] - *1* *2* [Conflict: Multiple assets emit different content to the same filename index.html报错解决方案](https://blog.csdn.net/qq_57587705/article/details/124329493)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] - *3* [vue在index.html中引入静态文件不生效问题及解决方法](https://download.csdn.net/download/weixin_38748239/13198844)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值