问题描述:
fat压测环境中,突然出现大量redis相关报错:
org.springframework.dao.InvalidDataAccessApiUsageException: ERR 'EVAL' command keys must in same slot. channel: [id: 0x10457fd7...
原因分析:
开发、测试环境 redis 是公司内部搭建的单机版本,fat是模拟生产用的阿里云redis集群。导致同样的lua脚本在redis集群模式下出现错误。
在 Redis 集群模式下,需要确保 同一个Lua 脚本中的多个 key 能够位于同一个 hash 槽中!
问题解决:
1、有人提出,使用相同的key前缀,可以让有相同前缀的key分布在同一个hash槽中;(错误的方案)
对于这一点,我是不认同的,因为这个无法绝对保证。
Redis 集群中,相同前缀的键并不一定会分配到同一个分片。Redis 集群采用哈希槽 (hash slot) 的方式来分配数据,每个键通过 CLUSTER KEYSLOT <key> 命令计算出它属于哪个槽。集群中的每个节点负责处理一部分槽。
但是,如果你是指同一个前缀的键在分配时会不会落到同一个节点上,那么答案是可能的,也可能不会。因为键的分配基于哈希槽,而槽的分配又基于键的哈克尔值。如果有相同前缀的键具有相似的哈克尔值,它们可能会落到相同的槽,进而被同一节点处理。但是,这并不是一个可靠的行为,因为哈克尔值的分布是不可预测的。
再一个,即使能满足需求,但是也会导致热点数据倾斜分布不均的问题。
2、使用哈希标签:{};(推荐)
如果数据是不在一个slot下的键值,是不能使用mget,mset等多键操作的。
但是可以通过&nb


2339

被折叠的 条评论
为什么被折叠?



