redis集群实现(四) 数据的和槽位的分配
来源:互联网 发布:打条码软件 编辑:程序博客网 时间:2024/06/05 16:15
不知道有没有人思考过Redis是如何把数据分配到集群中的每一个节点的,可能有人会说,把集群中的每一个节点编号,先放第一个节点,放满了就放第二个节点,以此类推。。如果真的是这样的话,服务器的利用率和性能就太低了,因为先放第一个,其他的服务器节点就闲置下来了,单个节点的压力就会非常的大,其实就相当于退化成为了单机服务器,从而违背了集群发挥每一个节点的性能的初衷。
在redis官方给出的集群方案中,数据的分配是按照槽位来进行分配的,每一个数据的键被哈希函数映射到一个槽位,redis-3.0.0规定一共有16384个槽位,当然这个可以根据用户的喜好进行配置。当用户put或者是get一个数据的时候,首先会查找这个数据对应的槽位是多少,然后查找对应的节点,然后才把数据放入这个节点。这样就做到了把数据均匀的分配到集群中的每一个节点上,从而做到了每一个节点的负载均衡,充分发挥了集群的威力。
在redis中,把一个key-value键值对放入的最简单的方式就是set key value,如下所示:
可以看出,当我们把key的值设置成为value的时候,客户端被重定向到了另一个节点192.168.39.153:7002,这是因为key对应的槽位是12359,所以我们的key-value就被放到了槽12359对应的节点,192.168.39.153:7002了。接下来,我们来看看redis是怎么把一个key-value键值对映射成槽,然后又如何存放进集群中的。
首先在redis.c文件里定义了客户端命令和函数的对应关系,
可以看出,set命令会执行setCommand函数进行解析,继续进入setCommand函数查看
继续进入setGenericCommand函数
接着看数据库的setKey函数
当没有在数据库中发现key的时候,我们需要执行dbAdd函数把key-value添加到数据库里。
继续进入slotToKeyAdd函数
keyHashSlot是一个哈希函数,通过key映射到一个0-16384的整数,我们来看一下实现
计算key字符串对应的映射值,redis采用了crc16函数然后与0x3FFF取低16位的方法。crc16以及md5都是比较常用的根据key均匀的分配的函数,就这样,用户传入的一个key我们就映射到一个槽上,然后经过gossip协议,周期性的和集群中的其他节点交换信息,最终整个集群都会知道key在哪一个槽上。
- redis集群实现(四) 数据的和槽位的分配
- redis集群实现(四) 数据的和槽位的分配
- Redis Cluster 集群的实现和管理
- 【redis 基础篇四】集群的搭建
- 利用8255A实现四位数据的显示输出
- redis集群的搭建(伪集群)
- redis 集群上(四)
- Redis多机数据库的实现(集群、复制、sentinel)
- Redis集群:基于twemproxy的实现
- Redis的主从复制集群实现
- 如何实现高可用的redis集群
- Redis 集群的安装(Redis+CentOS)
- 结合redis设计与实现的redis源码学习-1-内存分配(zmalloc)
- rabbitmq和redis的集群方案
- Redis: sentinel集群的搭建和测试
- Redis 集群的分库和分片
- redis的集群,添加和删除节点
- redis集群的合纵和连横
- 在码云上创建一个项目
- |0830|java作业
- 总结命令行06:Spark
- redis相关
- 关于trycatchfinal返回值问题
- redis集群实现(四) 数据的和槽位的分配
- Java编程思想读书笔记——对象导论
- Java GC 变量含义(S0 S1 E O P YGC YGCT FGC FGCT GCT)
- Java Math类取整
- DelayQueue使用示例
- OpenCV——findContours函数的使用(基于Mat轮廓处理基础)
- 市场上各种深度摄像头测试之OPT8241
- Winform 刷新闪烁
- unity中EventSystem射线检测结果的排序规则