Redis Cluster linux下批量刪除鍵
說明
使用時不支持傳入參數 *, 如 redis_batch_del.sh *, 因為在linux下 會自動將 * 解析為當前目錄下所有文件名, 目前還沒有想到好的解決辦法。
如果需要flushall 可以自行加入參數判斷, 執行flushall。
代碼
#!/usr/bin/env bash
#######################################################################################
#使用說明:
# 腳本需要設置 三個參數, 即:
# 1. redis_home, 注意, 最后沒有 /
# 2. redis_password
# 3. redis_enable_port redis集群中任意可用節點的端口
# 參數設置完畢后, 執行腳本時, 可同時刪除多個key, 匹配方式為 redis的 pattern.
# 多個參數之間以空格隔開.
# 在任意redisCluster的節點上執行即可
# 如 redis_batch_del.sh hello* hhh* *hhh*
#######################################################################################
redis_home='/opt/TDS/redis/'
#redis密碼
redis_password='redis'
#redis 任意可用redis 服務端端口
redis_enable_port='7001'
#如果沒有redis密碼, 需要刪除 -a $reis_password
master_info=(`$redis_home/src/redis-cli -c -a $redis_password -p $redis_enable_port cluster nodes |grep 'master'`)
address_array=()
#獲取所有master節點
for item in ${master_info[@]}
do
if [[ $item =~ '@' ]]
then
echo '當前redis的 master 節點為:' $item
address_array[${#address_array[*]}]=$item
fi
done
#最終addresses 存儲的為 ip port, 例 ${addresses[0]} 為 192.168.0.1 ${addresses[1]} 為 7001
addresses=()
for item in ${address_array[@]}
do
temp_split=(${item//@/ })
ip_port=${temp_split[0]}
temp_split=(${ip_port//:/ })
addresses[${#addresses[*]}]=${temp_split[0]}
addresses[${#addresses[*]}]=${temp_split[1]}
done
function del_key_with_pattern() {
local length=${#addresses[*]}
local index=0
while [ $index -lt $length ]
do
local port_index=`expr $index + 1`
#如果沒有redis密碼, 需要刪除 -a $reis_password
local redis_command="$redis_home/src/redis-cli -a $redis_password -c -h ${addresses[${index}]} -p ${addresses[${port_index}]}"
#屏蔽錯誤信息.
$redis_command keys $1 2>/dev/null |xargs -i $redis_command del {} >/dev/null 2>&1
echo "清除節點: ${addresses[${index}]}:${addresses[${port_index}]} 的 $1 數據"
index=`expr $port_index + 1`
done
}
for item in "$@"
do
del_key_with_pattern $item
done