自动同步到redis数据库的shell脚本

------同步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的版本不一致或者版本较低可能导入数据时会有问题

 

posted @ 2023-10-20 10:15  菜菜陈  阅读(223)  评论(0)    收藏  举报