Object#

基本概念#

openYuanrong datasystem (下文中称为数据系统)的object接口,基于共享内存实现 host上的 Object 语义读写,提供基于引用计数管理生命周期,将共享内存抽象为 buffer,直接映射共享内存指针,提供更底层灵活的编程接口。

样例代码#

object 接口中提供了 buffer 类,其中封装了共享内存,可直接将指针映射,并提供了锁保证数据一致性。 object 当前支持基于引用计数的生命周期管理,当对象的引用计数大于 0 时,保持对象的生命周期,当对象的引用计数变为 0 时,则删除对象。

import random
from datasystem.ds_client import DsClient

def random_str(slen=10):
    seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^*()_+=-"
    sa = []
    for _ in range(slen):
        sa.append(random.choice(seed))
    return ''.join(sa)

def object_test():
    client = DsClient("127.0.0.1", 31501)
    client.init()
    object_key = "test_key"
    value = bytes(random_str(100), encoding='utf8')
    buffer = client.object().create(object_key, len(value))
    client.object().g_increase_ref([object_key])
    assert client.object().query_global_ref_num(object_key) == 1
    buffer.wlatch()
    buffer.memory_copy(value)
    buffer.seal()
    buffer.unwlatch()
    buffer_list = client.object().get([object_key], 0)
    assert buffer_list[0].immutable_data().tobytes() == value
    #self.assertEqual(buffer_list[0].immutable_data().tobytes(), value)
    client.object().g_decrease_ref([object_key])
    assert client.object().query_global_ref_num(object_key) == 0
    #self.assertEqual(client.object().query_global_ref_num(object_key), 0)
    try:
        client.object().get([object_key], 0)
    except RuntimeError as e:
        print("get error:", e)
#include "datasystem/datasystem.h"

ConnectOptions connectOptions = { .host = "127.0.0.1", .port = 31501 };
auto client = std::make_shared<DsClient>(connectOptions);
ASSERT_TRUE(client->Init().IsOk());

std::string objectKey = "testKey";
std::string data = "Hello object client";
int size = data.size();
std::shared_ptr<Buffer> buffer;
Status status = client->Object()->Create(objectKey, size, CreateParam{}, buffer);
ASSERT_TRUE(status.IsOk());
ASSERT_EQ(size, buffer->GetSize());
std::vector<std::string> failedobjectKeys;
ASSERT_TRUE(client->Object()->GIncreaseRef({ objectKey }, failedobjectKeys).IsOk());
buffer->WLatch();
buffer->MemoryCopy((void *)data.data(), size);
buffer->Seal();
buffer->UnWLatch();

std::vector<Optional<Buffer>> buffers;
ASSERT_TRUE(client->Object()->Get({ objectKey }, 0, buffers).IsOk());
ASSERT_EQ(buffers[0]->GetSize(), size);
buffers[0]->RLatch();
ASSERT_EQ(memcmp(data.data(), buffers[0]->MutableData(), size), 0);
buffers[0]->UnRLatch();
ASSERT_TRUE(client->Object()->GDecreaseRef({ objectKey }, failedobjectKeys).IsOk());
ASSERT_TRUE(client->Object()->Get({ objectKey }, 0, buffers).IsError());

数据一致性#

Object 接口支持可变的读写一致性,当前支持 PRAM 和 Causal 两种一致性级别。在创建对象时,可通过 CreateParam.consistencyType 参数指定一致性级别。 一致性模型定义参见 Consistency Models

数据溢出到磁盘#

Object 数据支持将数据溢出到磁盘,相关配置与 KV 相同,详情参见 KV 中的描述。

使用限制#

  • key 仅支持大写字母、小写字母、数字以及如下特定字符:-_!@#%^*()+=:;

  • key 的最大长度为 255 字节。

  • value 的最大长度没有限制,但是不能超出配置的共享内存大小。

  • 未写入二级缓存的数据,不保证数据可靠性,当发生故障时数据可能会丢失。