传文件到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()
版权所有,转载注明来源

评论(0)