我是如何解决redis集群批量获取的效率问题的
1个回答
展开全部
相信各位在使用redis集群的时候,对于redis集群中的批量操作都会有一个现象:使用redis集群进行批量获取数据的时候,效率总是不高,取一次数据要达到几百毫秒,当你操作的数据是百万级别的时候,你就会发现redis的读取效率压根就不能接受。接下来告诉大家如何进行了解
### redis集群的哈希槽
redis集群中内置了16384个哈希槽,当一个key值准备存储的时候,是先通过将key进行 crc16 校验,校验后的值对16384取值,得到的值就是该key所在的槽(slot);redis集群中,节点上的槽是连续的一段,因此通过我们计算key得到的slot,就能判断该key是在存储在哪个节点上的。
#### 如何判断redis集群中各个节点上的slot分布?
使用命令 : cluster nodes 或者 cluster slots
#### 如何知道一个key值对应的槽
使用命令: cluster keyslots {key}
#### 提高效率的解决方案
因此,通过上面我们就可以知道key值存储对应的reids集群的节点,因此我们可以做以下处理:将你所需要的key按照槽的值进行分批,用单点连接的形式连接到某个redis节点上,批量取处于同一个节点上的key。
注意:
- 一定要用单点的形式进行连接,还是使用集群方式连接的话,就算是处于一个节点,效率也是没有提高的;
- redis集群单点连接的话,不能使用mget,因此mget只能取位于同一个 slot 上的,你可以使用pipeline进行事务处理;
### 一次具体的实现
目前我使用的语言的php,借鉴了
[crc16算法计算](https://www.php.net/manual/en/function.crc32.php)
这个方式得到的结果再进行 mod 16384(固定值),从而得到hash槽。
### 后记
因为知道了我的这些key的hash值,同时我也需要知道这些key值对应的节点,因此可以通过redis的命令(cluster slots)从而可以动态的得到相应的节点以及节点的hash值;
### redis集群的哈希槽
redis集群中内置了16384个哈希槽,当一个key值准备存储的时候,是先通过将key进行 crc16 校验,校验后的值对16384取值,得到的值就是该key所在的槽(slot);redis集群中,节点上的槽是连续的一段,因此通过我们计算key得到的slot,就能判断该key是在存储在哪个节点上的。
#### 如何判断redis集群中各个节点上的slot分布?
使用命令 : cluster nodes 或者 cluster slots
#### 如何知道一个key值对应的槽
使用命令: cluster keyslots {key}
#### 提高效率的解决方案
因此,通过上面我们就可以知道key值存储对应的reids集群的节点,因此我们可以做以下处理:将你所需要的key按照槽的值进行分批,用单点连接的形式连接到某个redis节点上,批量取处于同一个节点上的key。
注意:
- 一定要用单点的形式进行连接,还是使用集群方式连接的话,就算是处于一个节点,效率也是没有提高的;
- redis集群单点连接的话,不能使用mget,因此mget只能取位于同一个 slot 上的,你可以使用pipeline进行事务处理;
### 一次具体的实现
目前我使用的语言的php,借鉴了
[crc16算法计算](https://www.php.net/manual/en/function.crc32.php)
这个方式得到的结果再进行 mod 16384(固定值),从而得到hash槽。
### 后记
因为知道了我的这些key的hash值,同时我也需要知道这些key值对应的节点,因此可以通过redis的命令(cluster slots)从而可以动态的得到相应的节点以及节点的hash值;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询