关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案

关于Redis集群模式下,使用mget通过keys批量获取value时的解决方案

今天在做项目的时候,需要使用到mget命令,通过一个批量的key去获取对应的value集合,但是取值的时候,报了这个错误:ERR CROSSSLOT Keys in request don’t hash to the same slot,翻译过来就是这些keys不在同一个卡槽里,说白了就是在redis集群模式下,由于进行了hash分片处理之后,每次插入数据时,redis都会自动计算出每个数据所属的卡槽,又由于每个卡槽可能所处的节点不同,因此就会导致使用mget的时候,如果这一批keys分别位于不同节点时,就会导致获取value失败,根据redis计算数据所属卡槽位置的算法(原文在此),

unsigned int HASH_SLOT(char *key, int keylen) {
    int s, e; /* start-end indexes of { and } */

    /* Search the first occurrence of '{'. */
    for (s = 0; s < keylen; s++)
        if (key[s] == '{') break;

    /* No '{' ? Hash the whole key. This is the base case. */
    if (s == keylen) return crc16(key,keylen) & 16383;

    /* '{' found? Check if we have the corresponding '}'. */
    for (e = s+1; e < keylen; e++)
        if (key[e] == '}') break;

    /* No '}' or nothing between {} ? Hash the whole key. */
    if (e == keylen || e == s+1) return crc16(key,keylen) & 16383;

    /* If we are here there is both a { and a } on its right. Hash
     * what is in the middle between { and }. */
    return crc16(key+s+1,e-s-1) & 16383;
}

简单点来说,就是如果key中包含了{}字符,那么包含在{}中的字符才会被用来进行hash计算({abc}.123,只有abc会被用来做hash计算),且只有从左往右第一组的{}中包含的内容会被用来做hash计算,因此,如果想要在redis集群中让某一组特定的数据存储在同一个节点时,只需要指定好一个相同的key的前缀即可。比如:{abc}.123,{abc}.456,{abc}.789,它们都会被存储在同一个节点中,因此这样就能解决使用mget批量获取值时出现的问题了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值