zoukankan      html  css  js  c++  java
  • 任意指定一个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 ~]$ 
  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/imdba/p/10197192.html
Copyright © 2011-2022 走看看