------同步redis的脚本
#!/bin/bash
# Redis 数据库连接信息
HOME_DIR=/root
SH_DIR=${HOME_DIR}/XXX
PYTHON_DIR=${SH_DIR}/py39RedisEnv #数据插入redis的python脚本
REDIS_FILE=${SH_DIR}/redis.txt
SET_FILE=${PYTHON_DIR}/redis_set.txt #处理后的文件
LOG_FILE=${SH_DIR}/XXX.log
if [ -f $REDIS_FILE ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ----------------A-REDIS开始同步XXX数据---------------" >> ${LOG_FILE}
sed -i "s/'//g" $REDIS_FILE #去掉每行的''符号
while IFS= read -r line || [[ -n "$line" ]]; do #读取这个redis文件的每一行,有空行不异常退出
column2=$(echo "$line" | awk -F , '{print $2}')
if [ -z "$column2" ]; then #判断这个字段是否为空,后续处理逻辑不同
echo "$line" | awk -F , '{print "sadd",$3"xx",$6"-"$7}' >> $SET_FILE
else
echo "$line"| awk -F , '{print "sadd",$3"xx",$2}' >> $SET_FILE
fi
done < "$REDIS_FILE"
sh ${PYTHON_DIR}/app1.sh #执行python脚本,通过pipeline的方式写入redis
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ----------同步的redis数据是-----------" >> ${LOG_FILE}
cat $SET_FILE >> ${LOG_FILE}
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B-REDIS-xxx数据同步成功" >> ${LOG_FILE}
rm -rf $REDIS_FILE
rm -rf $SET_FILE
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:B-REDIS-xxx数据同步失败,程序退出" >> ${LOG_FILE}
exit 1
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B-REDIS-xxx数据无更新,执行结束" >> ${LOG_FILE}
fi
主要写入redis的脚本是通过python完成的,该shell只是处理这些数据变成redis命令的格式
注意点:shell也可以使用pipeline写入redis,但是缺点是速度慢且redis-cli版本和redis版本不一致时会有数据写入失败
#!/bin/bash
# Redis 数据库连接信息
REDIS_HOST=""
REDIS_PORT=""
REDIS_PASSWORD=""
DATABASE=1
# SQL 文件路径
SQL_FILE=$1
#处理sql文件
sed -i "s/'//g" $SQL_FILE
sed -i 's/),/)\n/g' $SQL_FILE
sed -i 's/(//g' $SQL_FILE
while read -r line; do
# 使用 cut 命令将每行内容按照空格拆分成三个字段
A=$(echo $line | cut -d ' ' -f 1)
B=$(echo $line | cut -d ' ' -f 2)
C=$(echo $line | cut -d ' ' -f 3)
KEY=$A
VALUE1=$B
VALUE2=$C
# 将 key-value 导入到 Redis 中
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $DATABASE HMSET $KEY tt $VALUE1 oo $VALUE2
done < $SQL_FILE
#普通导入redis数据的脚本,当有大量的数据需要导入时,该脚本执行效果较差,会产生大量socket。根据需要导入redis的数据类型修改导入命令
#!/bin/bash
# Redis 数据库连接信息
REDIS_HOST=""
REDIS_PORT=""
REDIS_PASSWORD=""
DATABASE=1
# SQL 文件路径
SQL_FILE=$1
redis_all=""
count=0
line=`sed -n '1,10000p' $SQL_FILE`
for i in $line
do
while read -r line; do
# 使用 cut 命令将每行内容按照空格拆分成三个字段
A=$(echo $line | cut -d ' ' -f 1)
B=$(echo $line | cut -d ' ' -f 2)
C=$(echo $line | cut -d ' ' -f 3)
redis_all+="HMSET $A priority $B realYys $C\n"
((count++))
if [ $count >= 10000 ];then
echo -e "$redis_all" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $DATABASE --pipe
fi
done < $SQL_FILE
echo -e "$redis_all" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $DATABASE --pipe
#和上面脚本的区别在于,使用了redis的pipeline功能,可以批量导入数据。如果redis-cli和redis的版本不一致或者版本较低可能导入数据时会有问题