关于 redis集群的局限性问题?

https://blog.csdn.net/chouhui0263/article/details/100744275
这里面提到了一点:

key作为数据分区的最小粒度读,因此不能将一个大的键值对象如hash、list等映射到不同的节点。

问题:

1.什么情况下 一个大的键值对象如hash、list等 会 映射到 不同的节点?

2.我的理解,redis中的hash命令是 hset hashKey key value ,其中只有hashKey参与
crc16(hashKey)&16384 计算 哈希对象值所在的槽位。 而不是hashkey+key参与运算。

也就是说同一个hash对象的所有 键值对会位于同一个slot中。 这个理解对吗?

阅读 599
avatarAI BotBETA
  1. 当你的数据分区策略是将一个大的键值对象如hash、list等作为一个整体存储在Redis集群的一个节点上时,就会出现一个大的键值对象映射到不同的节点的情况。例如,你可能将一个大的hash对象作为一个整体存储在Redis集群的节点上,而这个hash对象又被分为多个键值对。如果这个节点因为某些原因失效了,那么这个大的hash对象就会丢失,并且无法恢复。
  2. 你的理解是正确的。在Redis中,哈希命令是hset hashKey key value,其中只有hashKey参与crc16(hashKey)&16384计算哈希对象值所在的槽位。也就是说,同一个哈希对象的所有键值对都会位于同一个槽位中。因此,如果一个槽位对应的节点失效了,那么该槽位上存储的所有数据都会丢失,并且无法恢复。这也意味着,如果一个大的键值对象被分配到了多个槽位上,那么如果其中一个节点失效了,那么该键值对象的一部分数据就会丢失。这是Redis集群的一个局限性。
2 个回答

1.什么情况下 一个大的键值对象如hash、list等 会 映射到 不同的节点?
看这篇文章的描叙,集群化理想状态是把大的key也能实现分段存储,避免资源倾斜,但是redis集群并没有实现这个功能

  • 1.什么情况下 一个大的键值对象如hash、list等 会 映射到 不同的节点?

    Redis 是基于 Key 的哈希计算后,进行分槽,最终落到某个节点上。

    那什么情况下希望分不到不同节点? 当然是单节点抗不住并发的时候。

    那如何解决?可以采用多副本性质(代码实现,只是方案之一),比如:hash:1/hash:2/hash:3...hash:15,让每个 key 的值是一样,在通过分流只想到不同的 key。


  • 2.我的理解,redis中的hash命令是 hset hashKey key value ,其中只有hashKey参与 crc16(hashKey)&16384 计算 哈希对象值所在的槽位。 而不是hashkey+key参与运算。

    也就是说同一个hash对象的所有 键值对会位于同一个slot中。 这个理解对吗?

    ----

    答案:对。为尽可能避免大 key 的出现,以及单点(单 key 对应的单节点)负载问题。可以尽可能的“负载均衡”下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题