有没有人思考过redis是如何把数据分配到集群中的每个节点的,可能有人会说,把集群中的每个节点编号,先放第一个节点,放满了就放第二个节点,以此类推。。若是真的是这样的话,服务器的利用率和性能就过低了,由于先放第一个,其余的服务器节点就闲置下来了,单个节点的压力就会很是的大,其实就至关于退化成为了单机服务器,从而违背了集群发挥每个节点的性能的初衷。
在redis官方给出的集群方案中,数据的分配是按照槽位来进行分配的,每个数据的键被哈希函数映射到一个槽位,redis-3.0.0规定一共有16384个槽位,固然这个能够根据用户的喜爱进行配置。当用户put或者是get一个数据的时候,首先会查找这个数据对应的槽位是多少,而后查找对应的节点,而后才把数据放入这个节点。这样就作到了把数据均匀的分配到集群中的每个节点上,从而作到了每个节点的负载均衡,充分发挥了集群的威力。数据库
在redis中,把一个key-value键值对放入的最简单的方式就是set key value,以下所示:
127.0.0.1:7000> set key value
-> Redirected to slot [12539] located at 192.168.39.153:7002
OK
192.168.39.153:7002> get key
"value"
192.168.39.153:7002>
能够看出,当咱们把key的值设置成为value的时候,客户端被重定向到了另外一个节点192.168.39.153:7002,这是由于key对应的槽位是12359,因此咱们的key-value就被放到了槽12359对应的节点,192.168.39.153:7002了。接下来,咱们来看看redis是怎么把一个key-value键值对映射成槽,而后又如何存放进集群中的。负载均衡
计算key字符串对应的映射值,redis采用了crc16函数而后与0x3FFF取低16位的方法。crc16以及md5都是比较经常使用的根据key均匀的分配的函数,就这样,用户传入的一个key咱们就映射到一个槽上,而后通过gossip协议,周期性的和集群中的其余节点交换信息,最终整个集群都会知道key在哪个槽上。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75463.html