shell 例程 —— 解决redis读取稳定性

问题背景: php读取线上redis数据,常常不稳定,数据响应时有时无。

解决方法:多次读取。每次读取全部上一次没读出的数据,直到全部获取。

本文实现用shell进行多次redis数据读取, 每次取出当中的有效值(对于我们的样例中,就是给key,能在redis上取得其value的为有效值。其它无效),并将无效值重跑一遍,以此迭代,直到全部redis数据被取出。PS:redis数据能够由php或C读出,给定接口的话很easy,详细能够參考phpredis。。因为可能涉密,本文中不给出这块的实现。


  1. 方法概述:

    1. 将source中的key分为N个文件。丢入redis并行get value
    2. 实时统计N个文件get value输出结果的总行数,以及当中有效的行数
    3. N个文件统计结束后, 将其全部结果合并,放入result/step/stepx.res
    4. 删除原先并行的的source文件,结果文件
    5. 将result中未获取到的key放入source/step2/contsigns。作为下一轮的输入。再次将其分为N个文件,运行(这里的contsign就是redis的key)
    6. 最后将各个step所得结果都写入final.res文件。cat result/steps/step*.res >> final.res
  2. 项目结构:

    • getredis.php: 实现获取redis数据
    • all.sh: 主程序,并行运行getredis.php;
    • analyze_result.sh: 实时分析redis获取数据运行情况(第2步), 加參数后实现上面的第3-5步(详细见下一节凝视);
    • source/:存储输入数据,当中all/下为原始全部redis的输入。 step2/为这一轮中未获取到的key,将作为下一轮获取redis的输入, 其余(如xaa)为当前这一轮中key分成的N个文件;
    • result/: 存储结果。当中source/包括当前一轮source下全部N个文件的输出;steps/包括各轮输出后的合并结果
  3. 详细实现:

    all.sh :

#Author:Rachel Zhang
#Email: [email protected].com

for file in source/*
do
    {
        echo "processing source $file"
        if test -f $file
        then
            php getredis.php $file > result/$file
        fi
        echo "$file done..."
    }&
done


analyze_result.sh:

#Author:Rachel Zhang
#Email: [email protected]

Filefolder=result/source/*
#Filefolder=source/*

echo "##################################"
echo "     In Folder $Filefolder"
echo "##################################"
nl=0
hv=0
for file in $Filefolder
do
    if test -f $file
    then
        fline=`wc -l $file | awk ‘{print $1}‘`
        nl=$(($nl+$fline))
        fvalue=`cat $file |awk ‘BEGIN{x=0;}{if($2) x=x+1;}END{print x;}‘`
        hv=$(($hv+$fvalue))
    fi
done

echo "totally $nl lines"
echo "$hv lines have tag value"

##################################
#combine results into one file

if [ "$#" -gt 0 ]
then
    if test -e "result/all.result"
    then
        mv result/all.result result/all.result.bak
    fi

    for file in $Filefolder
    do
        if test -f $file
        then
            cat $file >> result/all.result
        fi
    done
    echo "all the output are write in result/all.result"

    # put null-value keys into source/step2/contsigns
    if  test -e source/step2
    then
        mkdir source/step2
    fi
    cat result/all.result| awk ‘{if($2==null) print}‘ > source/step2/contsigns
    Nnull_value=`wc -l source/step2/contsigns | awk ‘{print $1}‘`
    echo "remaining ${Nnull_value} keys to be processed"

    # put has-value key-value into result/steps/step${step_id}.res
    step_id=1
    while test -e result/steps/step${step_id}.res
    do
        step_id=$(($step_id+1))
    done
    cat result/all.result | awk ‘{if($2) print}‘ > result/steps/step${step_id}.res
    echo "current valid results are writen in result/steps/step${step_id}.res"

    # remove the current source files, generate new source files and re-run all.sh
    echo "remove current source and result files?

(y/n)"
    read answer
    if [ $answer == "y" ]; then
        if [ $Nnull_value -gt 10 ]; then
            rm source/*
            rm result/source/*
            cd source && split -l 5000 step2/contsigns && cd ../
            echo "now re-run sh ./all.sh?

(y/n)"
            read answer
            if [ $answer == "y" ]; then
                sh all.sh
            fi
        fi
    fi
fi

PS: 以上analyze_result.sh 还能够去掉analyze_result.sh中的interactive部分(无需用户输入)。通过crontab进行定时,进一步自己主动化运行。

时间: 2024-10-12 07:33:46

shell 例程 —— 解决redis读取稳定性的相关文章

APP-FND-00676: 弹性域例程 FDFGDC 无法读取为此说明性弹性域指定的默认引用字段

路径: AR: 设置- 财务系统 - 弹性域- 说明性 -注册 手工增加: RECEIPT_METHOD_ID 路径: AR: 设置- 财务系统 - 弹性域- 说明性 -段 路径:收款 - 收款 点 "冲销 " 按钮 报错信息 APP-FND-00676: 弹性域例程 FDFGDC 无法读取为此说明性弹性域指定的默认引用字段.开发员指定的上下文字段(通过 " 注册说明性弹性域 "表单)不在该表单的此块中. 措施:请与您的系统管理员联系,并为此说明性弹性域选择另一个默

解决Python读取文件时出现UnicodeDecodeError: 'gbk' codec can't decode byte...

用Python在读取某个html文件时会遇到下面问题: 出问题的代码: 1 if __name__ == '__main__': 2 fileHandler = open('../report.html', mode='r') 3 4 report_lines = fileHandler.readlines() 5 for line in report_lines: 6 print(line.rstrip()) 修改方式是在open方法指定参数encoding='UTF-8': if __nam

高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程: 1.redis集群大面积故障 2.缓存失效,但依然大量请求访问缓存服务redis 3.redis大量失效后,大量请求转向到mysql数据库 4.mysql的调用量暴增,很

解决redis上显示timeout连接超时

解决redis上显示timeout连接超时 首先从最简单的下手,如果你使用的是spring boot整合的redis,请看下redis配置是否正确. jedis: pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 timeout: 10000 保密起见,只截取一段代码,将timeout设置成为长点的时间,不要设置成0.这是客户端的设置. 如果出现timeout的话,还应该从服务器上查看是否redis是否工作正常(最终采取的是重启re

记一次为解决Python读取PDF文件的Shell操作

目录 一.背景 二.问题 三.解决 四.一顿分析及 Shell 操作 五.后续 一.背景 本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件.有的是免费的.收费,咱也不知哪个好使,还得一个个安装试用.先不说能不解决问题,就这安装试用想想就脑壳疼.便想起了"Python 大法",随即搜了几篇看起来比较完整的博客,二话不说粘贴复制,改改运行试试.使用环境(python3.6+pdfminer3k),代码这里就不放出来了. 二.问题 运气不好,这一试就报错WA

linux centos6.8下 php连接redis读取数据间歇性502解决

nginx报错提示: *963623 recv() failed (104: Connection reset by peer) while reading response header from upstream .. php-fpm.log报错提示: WARNING: [pool www] child 10559 exited on signal 11 (SIGSEGV) after 0.504455 seconds from start .. 解决:(服务器出现502错误 可能进程过多导

使用shell脚本备份redis并上传到ftp服务器

cat redis.sh #!/bin/bash #--------------------------------------------------   #Created:2015-04-29 #Author:jimmygong #Mail:[email protected] #Function:backup redis && ftp #Version:1.0 #-------------------------------------------------- if [[ `id -

shell学习三十二天----read读取一行

标准输入输出与标准错误输出 标准输入/输出可能是软件工具设计原则里最主要的观念了.他的构想是:程序应有一个数据来源,数据出口(数据要去哪里),以及报告问题的地方.他们分别叫做标准输入,标准输出和标准错误输出.程序应该不知道也不在意其输入与输出背后是还有一个运行的程序!程序能够预期,在他启动的时候,这些标准位置都已打开,且已经准备好能够使用了. 默认情况下,程序会读取标准输入,写入标准输出,并将错误信息传递给标准错误输出.这种程序我们称为过滤器,由于他们过滤数据流,每个都会在数据流上运行某种运算,

Linux 用户登录shell及登录时读取的配置文件

站在用户登录的角度来说,SHELL的类型: 登录式shell: 正常通过某终端登录 su - USERNAME su -l USERNAME 非登录式shell: su USERNAME(使用su切换用户,不带任何参数) GUI下打开命令窗口 自动执行的shell脚本 bash的配置文件: 全局配置 /etc/profile,/etc/profile.d/*.sh,/etc/bashrc 个人配置 ~/.bash_profile,~/.bashrc profile类的文件: 设定环境变量 运行命