任意指定一個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 ~]$ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM