任意指定一个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
测试
[redis@lxd-vm1 ~]$ sh get_node.sh a 5.5.5.103 [redis@lxd-vm1 ~]$ sh get_node.sh b 5.5.5.101 [redis@lxd-vm1 ~]$ sh get_node.sh c 5.5.5.102 [redis@lxd-vm1 ~]$ sh get_node.sh 1{abc}1 5.5.5.102 [redis@lxd-vm1 ~]$ sh get_node.sh 2{abc}2 5.5.5.102 [redis@lxd-vm1 ~]$ sh get_node.sh hello{lxd}world 5.5.5.101 [redis@lxd-vm1 ~]$ sh get_node.sh new{lxd}year 5.5.5.101 [redis@lxd-vm1 ~]$
欢迎多交流(QQ:616793474/329003748),谢谢!