传文件到TOS

package main

import (
    "fmt"
    "os"
    "strings"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    // accesskey和secretkey提前写在环境变量里了
    accessKey := os.Getenv("VOLC_ACCESS_KEY")
    secretKey := os.Getenv("VOLC_SECRET_KEY")
    endpoint := "https://tos-s3-ap-southeast-1.ibytepluses.com"
    region := "ap-southeast-1"
    bucketName := "桶名"
    objectKey := "seed-21001/111.txt"

    // 创建 AWS S3 客户端
    sess, err := session.NewSession(&aws.Config{
        Region:      aws.String(region),
        Endpoint:    aws.String(endpoint),
        Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
//        S3ForcePathStyle: aws.Bool(true),
        S3ForcePathStyle: aws.Bool(false),
    })
    if err != nil {
        panic(err)
    }

    svc := s3.New(sess)

    // 上传文件
    body := strings.NewReader("Hello TOS")
    _, err = svc.PutObject(&s3.PutObjectInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(objectKey),
        Body:   body,
    })
    if err != nil {
        fmt.Println("Error:", err)
        panic(err)
    }

    fmt.Println("Successfully uploaded to S3")
}

导出KV

import redis
import os
from datetime import datetime

def connect_kvrocks():
    host = '192.168.1.6'
    port = 7676
    client = redis.Redis(
        host=host,
        port=port,
        password='lqHj8fkth0p[密码]',
        ssl=True,
        ssl_ca_certs='/data/app/crt/w3p-internal.com-ca.crt',
        ssl_certfile='/data/app/crt/w3p-internal.com-client.crt',
        ssl_keyfile='/data/app/crt/w3p-internal.com-client.key',
        ssl_check_hostname=False,
        decode_responses=False  # 保持为字节
    )
    return client, host, port

def encode_bulk(val):
    # val: bytes
    return b"$%d\r\n%b\r\n" % (len(val), val)

def write_redis_command(cmd_and_args, f):
    # cmd_and_args: list of bytes
    f.write(b"*%d\r\n" % len(cmd_and_args))
    for arg in cmd_and_args:
        f.write(encode_bulk(arg))

def export_key(r, key, output_file):
    key_type = r.type(key).decode('utf-8')
    with open(output_file, 'ab') as f:
        if key_type == 'string':
            value = r.get(key)
            if value is not None:
                write_redis_command([b'SET', key, value], f)
        elif key_type == 'hash':
            hash_data = r.hgetall(key)
            if hash_data:
                args = [b'HMSET', key]
                for field, val in hash_data.items():
                    args.extend([field, val])
                write_redis_command(args, f)
        elif key_type == 'list':
            list_data = r.lrange(key, 0, -1)
            if list_data:
                args = [b'RPUSH', key] + list_data
                write_redis_command(args, f)
        elif key_type == 'set':
            set_data = r.smembers(key)
            if set_data:
                args = [b'SADD', key] + list(set_data)
                write_redis_command(args, f)
        elif key_type == 'zset':
            zset_data = r.zrange(key, 0, -1, withscores=True)
            if zset_data:
                args = [b'ZADD', key]
                for member, score in zset_data:
                    args.append(str(score).encode())
                    args.append(member)
                write_redis_command(args, f)
        # 可扩展类型

def main():
    output_dir = './output'  # 修改为实际输出目录
    os.makedirs(output_dir, exist_ok=True)  # 确保目录存在

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    r, host, port = connect_kvrocks()
    output_file = os.path.join(output_dir, f'export_{host}_{port}_{timestamp}.redis')

    # SCAN遍历
    cursor = 0
    total = 0
    with open(output_file, 'wb') as f:
        pass  # 清空旧文件

    while True:
        cursor, keys = r.scan(cursor=cursor, count=100)
        for key in keys:
            export_key(r, key, output_file)
            total += 1
        if cursor == 0:
            break

    print(f"成功导出 {total} keys 到 {output_file}")

if __name__ == '__main__':
    main()

导入kv

import subprocess
import os

def import_kvrocks(input_file, host, port, password, ca_cert, client_cert, client_key):
    if not os.path.exists(input_file):
        print(f"Error: File {input_file} does not exist.")
        return

    cmd = [
        'redis-cli',
        '-h', host,
        '-p', str(port),
        '--tls',
        '--cacert', ca_cert,
        '--cert', client_cert,
        '--key', client_key,
        '-a', password,
        '--pipe'
    ]

    try:
        with open(input_file, 'rb') as f:
            process = subprocess.Popen(
                cmd,
                stdin=f,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            stdout, stderr = process.communicate()

            if process.returncode == 0:
                print("Import completed successfully.")
                if stdout:
                    print(stdout.decode('utf-8'))
            else:
                print("Import failed.")
                print(stderr.decode('utf-8'))
    except Exception as e:
        print(f"An error occurred during import: {str(e)}")

def main():
    input_file = input("Enter the path to the export file: ")
    host = '192.168.1.9'  # 目标服务器IP
    port = 7676
    password = 'lqHj8fk[密码]'
    ca_cert = '/data/app/crt/w3p-internal.com-ca.crt'
    client_cert = '/data/app/crt/w3p-internal.com-client.crt'
    client_key = '/data/app/crt/w3p-internal.com-client.key'

    import_kvrocks(input_file, host, port, password, ca_cert, client_cert, client_key)

if __name__ == '__main__':
    main()

对比两个文件

# 读取两个文件
with open('output/keys_192.168.1.8_6676_20250615_122954.txt', 'r', encoding='utf-8') as f1, open('output/keys_192.168.1.9_7676_20250615_122839.txt', 'r', encoding='utf-8') as f2:
    lines1 = f1.readlines()
    lines2 = f2.readlines()

# 去除每行的换行符,并转换为集合(集合自动去重且查询效率高)
set1 = {line.strip() for line in lines1}
set2 = {line.strip() for line in lines2}

# 计算交集(即相同内容)
common_lines = set1 & set2

# 保存到新文件
with open('common_results.txt', 'w', encoding='utf-8') as f:
    for line in common_lines:
        f.write(line + '\n')

print(f"共找到{len(common_lines)}条相同内容,已保存到common_results.txt")

导出KEY

import redis
import os
from datetime import datetime

def connect_kvrocks():
    host = '192.168.1.8'
    port = 6676
    client = redis.Redis(
        host=host,
        port=port,
        password='lqHj8[密码]',
        ssl=True,
        ssl_ca_certs='/data/app/crt/w3p-internal.com-ca.crt',
        ssl_certfile='/data/app/crt/w3p-internal.com-client.crt',
        ssl_keyfile='/data/app/crt/w3p-internal.com-client.key',
        ssl_check_hostname=False,
        decode_responses=True  # 解码为字符串
    )
    return client, host, port

def main():
    output_dir = './output'
    os.makedirs(output_dir, exist_ok=True)

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    r, host, port = connect_kvrocks()
    output_file = os.path.join(output_dir, f'keys_{host}_{port}_{timestamp}.txt')

    cursor = 0
    total = 0
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            while True:
                cursor, keys = r.scan(cursor=cursor, count=100)
                for key in keys:
                    f.write(key + '\n')
                    total += 1
                if cursor == 0:
                    break
        print(f"成功导出 {total} 个key到 {output_file}")
    except redis.RedisError as e:
        print(f"连接或操作Kvrocks出错: {e}")
        exit(1)
    except Exception as e:
        print(f"发生错误: {e}")
        exit(1)

if __name__ == '__main__':
    main()
版权所有,转载注明来源