#!/bin/bash
# cluster node
HOST=""
# key delete
KEYS=""
# num per delete batch
NUM=5000
usage() {
echo "Usage:args [-h][-k][-n]"
echo "-h one redis cluster node (e.g. 127.0.0.1:7001)"
echo "-k key pattern (e.g. test*)"
echo "-n delete num per batch (e.g. 10000)"
}
while getopts "h:k:n:" arg; do
case $arg in
h)
HOST=$OPTARG
echo "connected to node: $HOST"
;;
k)
KEYS=$OPTARG
echo "delete key pattern: $KEYS"
;;
n)
NUM=$OPTARG
echo "delete num per batch: $NUM"
;;
\?)
usage
;;
esac
done;
if [ -z "$HOST" ] || [ -z "$KEYS" ]; then
usage
exit -1
fi
read -r -p "Are You Sure? [y/n] " input
case $input in
[yY])
;;
[nN])
exit 1
;;
*)
exit 1
;;
esac
starttime=`date +'%Y-%m-%d %H:%M:%S'`
CLUSTER_INFO=`redis-trib.rb info $HOST`
IFS=$'\n\n'
for i in $CLUSTER_INFO;
do
IP_LIST=`echo "$i" | awk -F '[ ]' '{print $1}' | awk -F '[:]' '{ if (length($2)!=0) print $1":"$2}'`
for ipt in $IP_LIST;
do
if [ -n $ipt ];then
IP=${ipt%%:*}
PORT=${ipt##*:}
CMD=`redis-cli -c -h $IP -p $PORT --scan --pattern $KEYS | xargs -L $NUM -i redis-cli -c -h $IP -p $PORT DEL {} | awk 'BEGIN {sum=0}{sum+=$1} END {print sum}'`
echo $IP":"$PORT" DELETED KEYS:"$CMD
fi
done
done
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "cost time: "$((end_seconds-start_seconds))"s"