shell 例程 —— 解决redis读取稳定性
问题背景: php读取线上redis数据,常常不稳定,数据响应时有时无。 
解决方法:多次读取。每次读取全部上一次没读出的数据,直到全部获取。
本文实现用shell进行多次redis数据读取, 每次取出当中的有效值(对于我们的样例中,就是给key,能在redis上取得其value的为有效值。其它无效),并将无效值重跑一遍,以此迭代,直到全部redis数据被取出。PS:redis数据能够由php或C读出,给定接口的话很easy,详细能够參考phpredis。。因为可能涉密,本文中不给出这块的实现。
- 方法概述: - 将source中的key分为N个文件。丢入redis并行get value
- 实时统计N个文件get value输出结果的总行数,以及当中有效的行数
- N个文件统计结束后, 将其全部结果合并,放入result/step/stepx.res
- 删除原先并行的的source文件,结果文件
- 将result中未获取到的key放入source/step2/contsigns。作为下一轮的输入。再次将其分为N个文件,运行(这里的contsign就是redis的key)
- 最后将各个step所得结果都写入final.res文件。cat result/steps/step*.res >> final.res
 
- 项目结构: 
 
 - 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/包括各轮输出后的合并结果
 
- 详细实现: 
 
 
 all.sh :
#Author:Rachel Zhang
#Email: zrqjennifer@sina.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..."
    }&
doneanalyze_result.sh:
#Author:Rachel Zhang
#Email: zrqjennifer@sina.com
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进行定时,进一步自己主动化运行。
shell 例程 —— 解决redis读取稳定性的更多相关文章
- 解决shiro多次从redis读取session的问题
		/** * 重写sessonManager * 解决shiro多次从redis读取session的问题 */ public class CustomSessionManager extends Def ... 
- APP-FND-00676: 弹性域例程 FDFGDC 无法读取为此说明性弹性域指定的默认引用字段
		路径: AR: 设置- 财务系统 - 弹性域- 说明性 -注册 手工增加: RECEIPT_METHOD_ID 路径: AR: 设置- 财务系统 - 弹性域- 说明性 -段 路径:收款 - 收款 点 ... 
- 解决Redis/Codis Connection with master lost(复制超时)问题
		今天在线上环境中遇到了codis-server报警,按照常规处理流程进行处理,报错步骤如下: 首先将codis-slave的rdb文件移除,并重启codis-slave 在codis-dashbord ... 
- 解决 python 读取文件乱码问题(UnicodeDecodeError)
		解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ... 
- lua入门demo(HelloWorld+redis读取)
		1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ... 
- 解决 Redis 只读不可写的问题
		本文转载:https://blog.csdn.net/han_cui/article/details/54767208?tdsourcetag=s_pcqq_aiomsg 解决 Redis 只读不可写 ... 
- 解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o...
		解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o... ... 
- 解决redis远程连接不上的问题
		解决redis远程连接不上的问题 redis现在的版本开启redis-server后,redis-cli只能访问到127.0.0.1,因为在配置文件中固定了ip,因此需要修改redis.conf(有的 ... 
- 关于解决java读取excel文件遇空行抛空指针的问题 !
		关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ... 
随机推荐
- px-em-rem单位转换
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
- Jmeter之重定向请求
			一.自动重定向和跟随重定向的区别 自动重定向:状态码一般是200.20X.当重定向自动跳转时,只针对GET和Head请求,自动重定向自动跳转到最终目标页面,当HTTP请求为自动重定向时,JMeter不 ... 
- arx 插入图片
			#include <ShLwApi.h> #pragma comment(lib, "ShLwApi.lib") //插入影像图 Acad::ErrorStatus i ... 
- 梦想Android版CAD控件2018.10.12更新
			下载地址: http://www.mxdraw.com/ndetail_10106.html 1. 增加读写对象扩展字典功能 2. 修改样条线显示错误 3. 修改shx文字显示错误 4. 增加向量运算 ... 
- 禁止foreach循环使用remove/add----快速失败
			阿里巴巴开发手册中有一条: 7[强制]不要在 foreach 循环里进行元素的 remove / add 操作. remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterato ... 
- 牛客多校Round 5
			Solved:3 rank:195 F. take 官方题解:小 A 在打开第 i 个箱子后会交换手中的钻石和第 i 个箱子中的钻石 当且仅当第 i个箱子的钻石是前 i 个箱子打开后出现的所有钻石里最 ... 
- docker 1-->docker swarm  转载
			实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ... 
- 用 Systemtap 统计 TCP 连接
			转自: https://mp.weixin.qq.com/s?__biz=MzIxMjAzMDA1MQ==&mid=2648946009&idx=1&sn=3a0be2fe4f ... 
- 个人总结的常用java,anroid网站
			http://blog.csdn.net/wanghao200906/article/details/49334987 
- 爬虫之Selenium库
			官方文档:https://selenium-python.readthedocs.io/ Selenium:自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染的问题. 一.开始 ... 
