通用技术 Redis 数据构造之存储过程

Yan · 2021年10月15日 · 1770 次阅读

提前准备
redis 集群
需求描述
大数据量(百万级别)
快速高效
构造方法
方法一:
代码生成 Redis Protocol 数据文件

package com.cs.test1;

import org.junit.Test;
import java.io.*;

public class RedisConstructionDataTest {
    /**
     * 字符串连接
     * 将各种数据类型变量的字符串形式追加到当前序列中
     */
    private String getString(String... args) {
        //StringBuffer stringbuffer = new StringBuffer();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("*").append(args.length).append("\r\n");
        for (String arg : args) {
            stringBuilder.append("$").append(arg.getBytes().length).append("\r\n");
            stringBuilder.append(arg).append("\r\n");
        }
        return stringBuilder.toString();
    }

    @Test
    public void generateFile() {
        Long startTime = System.currentTimeMillis();
        //FileWriter file = null;
        String file = "F:\\redis_data.txt";
        BufferedWriter bufferedWriter = null;
        StringBuilder stringBuilder = new StringBuilder();
        try {
            /**
             * 创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联。
             */
            //file = new FileWriter("F:\\redis_data.txt");
            //bufferedWriter = new BufferedWriter(file);
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
            for(int i=1; i <= 2000000; i++){
                if (i / 3 == 0) {
                    //刷新流中的缓冲,将缓冲数据写到目的文件中去
                    bufferedWriter.flush();
                }
                stringBuilder.setLength(0);
                stringBuilder.append(this.getString("set", "test" + i, "{\"Body\":\"互联网测试管理组\",\"personId\":\""+i+"\",\"csId\":\""+i+"\"}"));
                bufferedWriter.append(stringBuilder.toString());
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //刷新流中的缓冲,将缓冲数据写到目的文件中去
                bufferedWriter.flush();
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("耗时: "+(endTime - startTime)/1000+" s");
    }
}

查看生成文件

解释与说明:
如果设置显示全部字符,会发现每行已 CR LF 结尾,相当于\r\n。因为 Redis 的通信协议首先以行来划分,每行以\r\n 结束。
*3\r\n                                                                                            # 消息一共有三行
$3\r\n                                                                                           # 第一行字节数为 3
set\r\n                                                                                          # 第一行的内容
$5\r\n                                                                                          # 第二行字节数为 5
test1\r\n                                                                                      # 第二行的内容
$61\r\n                                                                                        # 第三行字节数为 61
{"Body":"互联网测试管理组","personId":"1","csId":"1"}\r\n         # 第三行的内容
上传数据文件到 Redis 服务器         
执行 Redis 命令
nohup cat redis_data.txt |redis-cli -h 10.101.21.162 -p 10001 -c --pipe >error1.log 2>&1 &
nohup cat redis_data.txt |redis-cli -h 10.101.21.162 -p 10002 -c --pipe >error2.log 2>&1 &
nohup cat redis_data.txt |redis-cli -h 10.101.21.162 -p 10003 -c --pipe >error3.log 2>&1 &
注意:集群每个主节点端口号都需要执行一遍
统计数据
方式一、查看命令执行后生成的日志文件进行统计

解释与说明:
插入数据量=(replies - errors),然后每个端口号数据量相加
方式二、查看 info 中 keyspace 信息进行统计

解释与说明:
插入数据量=Keys,然后每个端口号数据量相加(前提集群中没有数据;如果有,最好在插入数据之前查看有多少)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册