此快速启动指南将引导您完成安装和使用ReductStore Python client SDK的过程 与ReductStore实例互动。
安装SDK
要安装还原SDK,您需要在计算机上安装Python 3.7或更高版本。一旦Python是
已安装,您可以使用pip
软件包管理器安装reduct-py
软件包:
pip install reduct-py
作为Docker容器运行还原设备
如果您尚未运行还原的实例,则可以轻松地将一个实例旋转为Docker容器。为此,
运行以下命令:
docker run -d -p 8080:8080 reductstore/reductstore
这将在您本地计算机的端口8383上启动一个还原店实例。
使用SDK
现在,您已经安装了reduct-py
SDK并运行了还原商店实例,您可以开始使用SDK到
与还原店服务交互。
这是使用SDK在存储桶上执行一些不同操作的示例:
from pathlib import Path
from time import time_ns
from reduct import Client, BucketSettings, QuotaType
CURRENT_FILE = Path(__file__)
async def main():
# Create a ReductStore client
client = Client("http://localhost:8383")
# Get or create a bucket with 1Gb quota
bucket = await client.create_bucket(
"my-bucket",
BucketSettings(quota_type=QuotaType.FIFO, quota_size=1_000_000_000),
exist_ok=True,
)
# The simplest case. Write some data with the current timestamp
await bucket.write("entry-1", b"Hello, World!")
# More complex case. Upload a file in chunks with a custom timestamp unix timestamp in milliseconds
async def file_reader():
"""Read the current example in chunks of 50 bytes"""
with open(CURRENT_FILE, "rb") as file:
while True:
data = file.read(50) # Read in chunks of 50 bytes
if not data:
break
yield data
ts = int(time_ns() / 10000)
await bucket.write(
"entry-1",
file_reader(),
timestamp=ts,
content_length=CURRENT_FILE.stat().st_size,
)
# The simplest case. Read the data by a certain ts
async with bucket.read("entry-1", timestamp=ts) as record:
print(f"Record timestamp: {record.timestamp}")
print(f"Record size: {record.size}")
print(record.read_all())
# More complex case. Iterate over all records in the entry and read them in chunks
async for record in bucket.query("entry-1"):
print(f"Record timestamp: {record.timestamp}")
print(f"Record size: {record.size}")
async for chunk in record.read(50):
print(chunk)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
让我们分解这个示例在做什么。
创建客户
要创建一个还原店客户端,您可以使用reduct
模块的Client
类。通过还原店的URL
实例您想作为参数连接到Client
构造函数:
# Create a ReductStore client
client = Client("http://localhost:8383")
创建一个水桶
要获取或创建一个存储桶,您可以在Client
实例上使用create_bucket
方法。传递水桶的名称
你
想要获得或创建作为参数,以及BucketSettings
对象以指定存储桶的所需配额。
将exist_ok
参数设置为true以创建存储桶,如果不存在:
# Get or create a bucket with 1Gb quota
bucket = await client.create_bucket(
"my-bucket",
BucketSettings(quota_type=QuotaType.FIFO, quota_size=1_000_000_000),
exist_ok=True,
)
将数据写入水桶
要用当前时间戳将数据写入存储桶中的条目,您可以在Bucket
实例上使用write
方法。
将您要写入的条目的名称传递给参数,以及要编写的数据。 write
方法
将数据写入条目时,将自动使用当前时间戳:
# The simplest case. Write some data with the current timestamp
await bucket.write("entry-1", b"Hello, World!")
这是使用SDK在存储桶中写入数据的最简单情况。写入方法还允许
您要指定自定义时间戳。让我们看一个用自定义时间戳将数据上传到块中的示例:
要将块中的文件上传到存储桶中的条目,请传递
的名称
您要写入作为参数的条目以及在块中产生文件数据的生成器函数。
用content_length
参数指定文件的总大小,并用
指定自定义时间戳
timestamp
参数:
# More complex case. Upload a file in chunks with a custom timestamp unix timestamp in milliseconds
此代码片段显示了如何使用写入方法将文件中的文件上传到存储桶中的条目。发电机
函数file_reader
以50个字节的块读取文件,并得出数据。写方法从
中读取数据
发电机并将其写入水桶中的条目。
从水桶读取数据
要从存储桶中的条目中读取数据,您可以在Bucket
实例上使用read
方法。传递条目的名称
你
想要从您要阅读的时间戳阅读,您要阅读为参数的特定记录。使用语句
使用异步
打开记录,然后使用read_all
方法读取记录中的所有数据:
# The simplest case. Read the data by a certain ts
async with bucket.read("entry-1", timestamp=ts) as record:
print(f"Record timestamp: {record.timestamp}")
print(f"Record size: {record.size}")
print(record.read_all())
要迭代条目中的所有记录,您可以在存储桶实例上使用query
方法。传递条目的名称
您想迭代作为一个争论。使用for循环在记录上迭代,并在每个记录上使用读取方法
记录要在块中读取数据:
# More complex case. Iterate over all records in the entry and read them in chunks
async for record in bucket.query("entry-1"):
print(f"Record timestamp: {record.timestamp}")
print(f"Record size: {record.size}")
async for chunk in record.read(50):
print(chunk)
query
方法将异步迭代器返回到条目中的记录。默认情况下,该方法返回所有记录
在条目中。但是,您可以使用start
和stop
参数来指定要
的记录的时间间隔
取回。 start
参数指定时间间隔的开始,而stop
参数指定
的结束
时间间隔。这两个论点都是Unix微秒中的时间戳。
start_ts = 1609459200000000 # January 1, 2021 at 00:00:00
stop_ts = 1609827200000000 # January 31, 2021 at 23:59:59
async for record in bucket.query("entry-1", start=start_ts, stop=stop_ts):
# Process the record