通过shell模拟redis-trib.rb info的输出

需求:模拟redis-trib.rb info ip:port输出的结果

如:

[redis@lxd-vm3 ~]$ redis-trib.rb info 5.5.5.101:29001
/usr/local/ruby2.5.1/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated
5.5.5.103:29002 (a76debe0...) -> 1514 keys | 5463 slots | 1 slaves.
5.5.5.102:29001 (eb7dfeda...) -> 8196781 keys | 5457 slots | 1 slaves.
5.5.5.101:29003 (7c79008a...) -> 4497 keys | 5464 slots | 1 slaves.
[OK] 8202792 keys in 3 masters.
500.66 keys per slot on average.

通过shell脚本实现类似的:

redis-cli -h $1 -p $2 -c cluster slots | xargs -n8 |  awk '{print $3":"$4" "$2-$1+1}' > tmp_slot_num
awk '{a[$1]++}END{for(i in a)print i}' tmp_slot_num | sort -nk2 -t ":" > ip_port

total_keys=0
master_num=0
for i in `cat ip_port`
do
	let master_num=master_num+1
	instance_slots=0
	instance_keys=0
	redis_ip=$(echo $i | awk -F[:] '{print $1}')
	redis_port=$(echo $i | awk -F[:] '{print $2}')
	instance_keys=$(redis-cli -c -h $redis_ip -p $redis_port dbsize)
	let total_keys=total_keys+instance_keys
	slots=($(awk '/'$i'/{print $2}' tmp_slot_num))
	len=${#slots[@]}
	for(( j=0;j<=len-1;j++))
	do
		let instance_slots=instance_slots+${slots[j]}
	done
	echo "$redis_ip:$redis_port->$instance_keys keys->$instance_slots slots"
done
echo "[ok] $total_keys keys in $master_num masters."
avg=$(awk 'BEGIN{printf "%.2f
",'$total_keys'/16384}')
echo "$avg keys per slot on average."

测试结果

[redis@lxd-vm3 ~]$ sh a10.sh 5.5.5.101 29001
5.5.5.102:29001->8196781 keys->5457 slots
5.5.5.103:29002->1514 keys->5463 slots
5.5.5.101:29003->4497 keys->5464 slots
[ok] 8202792 keys in 3 masters.
500.66 keys per slot on average.
[redis@lxd-vm3 ~]$ 

  

原文地址:https://www.cnblogs.com/imdba/p/10323490.html