任意指定一个key获取该key所处在哪个node节点

Posted knowledge-is-power

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任意指定一个key获取该key所处在哪个node节点相关的知识,希望对你有一定的参考价值。

 

需求:任意指定一个key获取该key所处在哪个node节点上。

说明:redis自带的命令可以知道一个key所属的slot,可以知道node master对应哪些slot,但没有key和node的对应关系,使用该脚本,再也不需要猜了,可以在规划key的时候参考一下。

 

#获取指定的key在哪个slot上,该key可以是存在的或者不存在的均可。
key_slot=`redis-cli -h 5.5.5.101 -p 29001 -a abc123 -c cluster keyslot $1`

#获取node和slot的分布,输出格式如下,开始的#是注释,并非有效数据
#5.5.5.101|0-5461
#5.5.5.102|5462-10922 
#5.5.5.103|10923-16383
node_slot=`redis-cli -h 5.5.5.101 -p 29001 -a abc123 -c cluster nodes | grep master | awk -F |: {print $2"|"$NF}`

#判断是否找到对应的slot
find_tag=0
for i in $node_slot
do
    node_ip=`echo $i | awk -F [|] {print $1}`
    start_slot=`echo $i | awk -F [|] {print $2} | awk -F [-] {print $1}`
    end_slot=`echo $i | awk -F [|] {print $2} | awk -F [-] {print $2}`
    for((j=$start_slot;j<=$end_slot;j++))
    do
        if [[ $j == $key_slot ]];then
            echo $node_ip
            find_tag=1
        fi
    done
    if [[ $find_tag == 1 ]];then
        #找到后,退出循环,因为slot不会有重复的
        break
    fi
done

 测试

[[email protected] ~]$ sh get_node.sh a
5.5.5.103
[[email protected]-vm1 ~]$ sh get_node.sh b
5.5.5.101
[[email protected]-vm1 ~]$ sh get_node.sh c
5.5.5.102
[[email protected]-vm1 ~]$ sh get_node.sh 1{abc}1
5.5.5.102
[[email protected]-vm1 ~]$ sh get_node.sh 2{abc}2
5.5.5.102
[[email protected]-vm1 ~]$ sh get_node.sh hello{lxd}world
5.5.5.101
[[email protected]-vm1 ~]$ sh get_node.sh new{lxd}year
5.5.5.101
[[email protected]-vm1 ~]$ 

 

以上是关于任意指定一个key获取该key所处在哪个node节点的主要内容,如果未能解决你的问题,请参考以下文章

如何获取redis中String类型的全部key值

redis 怎样查找一个key?

redis 怎样查找一个key?

Redis 字符串(String)

redis中key的基本操作

Redis 字符串(String)